Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


SetTheme que no cambia los colores del tema

Sé que esta pregunta fue hecha pocas veces. Pero no puedo encontrar el problema en mi caso. Quiero cambiar el tema de la aplicación pero mi colorPrimary, colorAccent y etc. no están cambiando.

Mi MainActivity extiende BasicActivity. se parece a esto:

public class MainActivity extends BasicActivity { public static String MY_PREFS = "MY_PREFS"; private SharedPreferences mySharedPreferences; int prefMode = Activity.MODE_PRIVATE; private Toolbar toolbar; private TabLayout tabLayout; private ViewPager viewPager; private ViewPagerAdapter adapter; private TextView tabOne, tabTwo, tabThree; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } } 

Esta es mi BasicActivity (en este caso lo hice aún más simple para mostrar que el tema se toma de R.style):

 public class BasicActivity extends AppCompatActivity { public static String MY_PREFS = "MY_PREFS"; int prefMode = Activity.MODE_PRIVATE; protected void onCreate(Bundle savedInstanceState) { JsonParser parser = new JsonParser(getApplicationContext()); int resourceId = this.getResources().getIdentifier(parser.getThemeID(), "style", this.getPackageName()); setTheme(R.style.c_2ecc71_BC6C2B); if (android.os.Build.VERSION.SDK_INT >= 19) { getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); } super.onCreate(savedInstanceState); } } 

Y mi XML:

 <style name="c_2ecc71_BC6C2B" parent="@style/Theme.AppCompat.Light.NoActionBar"> <!-- Customize your theme here. --> <item name="colorPrimary">#2ecc71</item> <item name="colorPrimaryDark">#1ebc61</item> <item name="colorAccent">#BC6C2B</item> </style> 

De acuerdo con las preguntas anteriores este código debería funcionar pero en mi caso las vistas que tienen colorPrimary en su XML sigue cargando los colores del tema antiguo insted de la nueva, aunque setContentView(R.layout.activity_main); configurado el tema antes de llamar a setContentView(R.layout.activity_main);

¡Gracias!

  • Android: los márgenes especificados en estilo personalizado no tienen efecto
  • Toque fuera del cuadro de diálogo de Android para descartarlo?
  • Cambiar el color azul por defecto en el tema de Android holo a naranja (o cualquier otra cosa)
  • Android: ¿Cómo usar diferentes temas para diferentes versiones de Android?
  • Cambiar Theme.Dialog para que parezca Theme.Light.Dialog en Android
  • ¿Cómo personalizar el tema de la pantalla de preferencias para que parezca eso?
  • Uso de un tema para la pantalla de preferencias
  • ¿Existen bibliotecas de temas de código abierto o gratuitas para Android?
  • 8 Solutions collect form web for “SetTheme que no cambia los colores del tema”

    Estás intentando extender uno de los nuevos temas de Android (por encima de la API 21). Además de todas las respuestas anteriores, puede poner su tema en styles.xml (v21).

    Más información aquí https://developer.android.com/training/material/compatibility.html Introduzca aquí la descripción de la imagen

    No está seguro de si realmente desea establecerla de forma programática, pero puede probar esto: ¿Cómo setTheme a una actividad en tiempo de ejecución? No funciona llamada setTheme antes onCreate y setContentView

    Si está buscando configurarla para toda la aplicación, puede ser más fácil / limpia configurarla en el archivo AndroidManifest.xml.

     <application android:theme="@style/CustomTheme"> 

    Además, me gustaría evitar el uso de un nombre de estilo que tiene los valores en ella. El punto de usar un estilo es evitar la codificación de los valores y permitir que sean configurables y reutilizables. ¿Qué pasa si desea cambiar el colorPrimary, también va a cambiar el nombre de su estilo?

    En el archivo de manifiesto asegúrese de que el tema correcto para la actividad ….

    Si desea cambiar ese tipo de material durante el tiempo de ejecución, debe insertar todos los "setTheme (android.R.style.Theme_Name);" Métodos dentro de runonUiThread, como esto:

     public class BasicActivity extends AppCompatActivity { public static String MY_PREFS = "MY_PREFS"; int prefMode = Activity.MODE_PRIVATE; protected void onCreate(Bundle savedInstanceState) { JsonParser parser = new JsonParser(getApplicationContext()); int resourceId = this.getResources().getIdentifier(parser.getThemeID(), "style", this.getPackageName()); runOnUiThread(new Runnable() { @Override public void run() { setTheme(R.style.c_2ecc71_BC6C2B); } }); recreate(); if (android.os.Build.VERSION.SDK_INT >= 19) { getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); } super.onCreate(savedInstanceState); } } 

    Y llamar a recreate () después!

    De acuerdo con Android –

    Void recreate () Causa que esta actividad sea recreada con una nueva instancia. Esto resulta esencialmente en el mismo flujo que cuando se crea la actividad debido a un cambio de configuración: la instancia actual pasará por su ciclo de vida a onDestroy () y se creará una nueva instancia después de ella.

    Si usas Fragmentos, ignorarán el valor que hayas establecido en onCreate (), si anulas el método getTheme (), también se usará en fragmentos:

    Respondió a una pregunta diferente: Cambiar el tema de la actividad de forma programática

     @Override public Resources.Theme getTheme() { Resources.Theme theme = super.getTheme(); theme.applyStyle(R.style.c_2ecc71_BC6C2B, true); return theme; } 

    Utilícelo en su MainActivity o BasicActivity dependiendo del lugar en el que desee que se aplique. Usted NO tendrá que cambiarlo en el onCreate más.

    Simplemente modifique BasicActivity y MainActivity como se muestra a continuación y cree el tema apropiado. Puede utilizar la preferencia compartida para comprobar el estado del tema durante la aplicación.

    BasicActivity .java

     public abstract class BasicActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); try { if (getLayoutID() != 0) { setContentView(getLayoutID()); } } catch (Exception ex) { /* ... */ } final boolean THEME_DARK = true;// read appropriate value from SP or any other storage Toolbar toolbar; if ((toolbar = getToolbar()) != null) { if (THEME_DARK/* check theme type here*/) { toolbar.setPopupTheme(R.style.c_2ecc71_BC6C2B); } try { setSupportActionBar(toolbar); } catch (NoClassDefFoundError e) { // Toast finish(); } } if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { Window window = getWindow(); window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); window.setStatusBarColor(getResources().getColor(R.color.colorPrimary)); } } public abstract Toolbar getToolbar(); public abstract int getLayoutID(); } 

    MainActivity.java

      public class MainActivity extends BasicActivity { private Toolbar toolbar; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } @Override public Toolbar getToolbar() { return toolbar == null ? toolbar = (Toolbar) findViewById(R.id.toolbar) : toolbar; } @Override public int getLayoutID() { return R.layout.activity_main; } } 

    Has codificado el tema en BaseActivity , en lugar de obtener id de recurso BaseActivity .

    Necesitas poner setTheme(value_from_resourceId);

    Actualmente, la BaseActivity siempre llama independientemente del valor que analizaste

     setTheme(R.style.c_2ecc71_BC6C2B); 

    Que referir el valor de tiempo de ejecución

    Para establecer el tema en tiempo de ejecución, puede utilizar la siguiente línea de código:

    SetTheme (android.R.style.Theme_Name);

    Y escribirlo antes de llamar a método setContentView () y super.onCreate () dentro del método onCreate ().

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.