Cómo cambiar el tema de otro recurso de la aplicación en android?

Sé que hay una manera de definir temas definiéndolos en styles.xml y usarlos así

setTheme(android.R.style.MyTheme); 

Sin embargo, quiero obtener temas de otra aplicación que he desarrollado también. Conozco los nombres de recursos y en realidad soy capaz de obtener ID de tema con este bloque de código;

 Resources res = getPackageManager().getResourcesForApplication("com.example.theme"); int resThemeId = res.getIdentifier("my_theme","style","com.example.theme"); 

Cuando depuro, veo que resThemeId no es cero.

Entonces, necesito el comando final para fijar este tema. Antes de la función super.onCreate (), intento implementar este método pero parece que no está funcionando

 setTheme(resThemeId); 

Pero en lugar de esto, si escribo a continuación declaración, que funciona bien

 setTheme(android.R.style.Theme_Holo_Light); 

Entonces, ¿qué debo hacer para usar un tema de un recurso de paquete diferente?

Entonces, ¿qué debo hacer para usar un tema de un recurso de paquete diferente?

Usted no debe hacer esto por muchas razones. Escribí un proyecto sencillo que muestra que es realmente posible siempre y cuando el paquete contenga los recursos que usa su actividad.

Consulte: https://github.com/jaredrummler/SO-41872033


Básicamente, necesitará devolver los recursos del paquete de la actividad:

 public class MainActivity extends AppCompatActivity { Resources resources; @Override protected void onCreate(Bundle savedInstanceState) { int themeResId = getResources().getIdentifier("AppTheme", "style", "com.example.theme"); if (themeResId != 0) { setTheme(themeResId); } super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } @Override public Resources getResources() { if (resources == null) { try { resources = getPackageManager().getResourcesForApplication("com.example.theme"); } catch (PackageManager.NameNotFoundException e) { resources = super.getResources(); } } return resources; } } 

Esto es sólo para demostrar que es posible. Una vez más, recomiendo que evites esto.

Como ya se mencionó en un comentario, puede acceder a recursos de otras aplicaciones, pero el uso de otro tema de aplicaciones no funcionará.


Dado que la prueba es siempre una buena cosa vamos a echar un vistazo al código fuente (he utilizado API 24 fuentes)

Llamar setTheme() en una Activity invocará initializeTheme() en la clase principal ContextThemeWrapper , que terminará llamando a onApplyThemeResource(..) que a su vez intentará cargar los datos de los temas reales de los recursos llamando a theme.applyStyle(resId, true)

Siguiendo la cadena a través del contenedor Resources.Theme podemos ver en ResourcesImpl.ThemeImpl lo siguiente, donde se llama AssetManager para cargar el estilo en el tema:

 void applyStyle(int resId, boolean force) { synchronized (mKey) { AssetManager.applyThemeStyle(mTheme, resId, force); mThemeResId = resId; mKey.append(resId, force); } } 

Aquí es donde intenta y no puede cargar el tema extranjero de su otra aplicación.


Dado que la mayoría de los métodos que necesitaría utilizar son llamadas estáticas o métodos locales de paquetes, no parece que haya ninguna forma de lograr lo que se desea (por ejemplo, aplicar o crear un nuevo tema)

Incluso si usted consigue un asimiento del AssetManager de la otra aplicación usando getAssets() en un contexto no hay método accesible para crear o para aplicar temas .

Así que la única manera de usar los recursos de otra aplicación sería agregar los recursos a la suya.

¿Has visto esta demo: Multiple Theme Material Design

Puede comprobar esta demostración para el cambio de tema de ejecución.

Espero que te ayude.

  • ¿Puedo configurar los estilos personalizados globales de aplicaciones para los widgets de Android-support-design?
  • Android: No se puede diseñar el divisor de hilado
  • ¿Para usar layout_marginLeft en un estilo de botón aplicado como tema?
  • Android: Utilizar colores de resaltado predeterminados en un botón personalizado
  • ¿Cómo establecer el tema en ProgressDialog?
  • Tema Programáticamente establecido. Cómo volver a cargar Actividad para aplicar
  • Java.lang.RuntimeException Theme.Sherlock
  • Android Custom Theming en ActionBar / Tabs
  • Cambio de tema de diálogo para cada cuadro de diálogo
  • Android: ¿cómo cambiar el color del divisor datepicker?
  • Temas de aplicación, cambio e ImageView src basados ​​en el nombre del tema de la aplicación
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.