Android :: Cómo cambiar el tema de otro apk mediante programación

Tengo una aplicación llamada: preferencia, y quiero hacer temas para esta aplicación. Mi AndroidManifest.xml de preferencia es:

<application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="com.example.preference.MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> 

Y en MainActivity.java: Recibí un clic en el botón de cambio de tema:

 themeChange = (Button) findViewById(R.id.themeChange); themeChange.setOnClickListener(this); 

Tengo una aplicación de tema que tiene PinkTheme (styles.xml) y el nombre del paquete es com.example.theme.

 <resources xmlns:android="http://schemas.android.com/apk/res/android"> <style name="AppBaseTheme" parent="android:Theme.Light"> <!-- Theme customizations available in newer API levels can go in res/values-vXX/styles.xml, while customizations related to backward-compatibility can go here. --> </style> <style name="PinkTheme" parent="AppBaseTheme" > <item name="android:textColor">#FF69B4</item> <item name="android:typeface">monospace</item> <item name="android:textSize">40sp</item> <item name="android:windowBackground">#008000</item> </style> </resources> 

Y el onClick () de mi preferencia es:

 public void onClick(View v) { // TODO Auto-generated method stub switch(v.getId()){ case R.id.themeChange: Resources res = null; try { res = getPackageManager().getResourcesForApplication("com.example.theme"); } catch (NameNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } if(null != res) { int sId = res.getIdentifier("com.example.theme:style/PinkTheme", null, null); Theme themeObject = res.newTheme(); // theme object themeObject.applyStyle(sId, true); // Place new attribute values into the theme getTheme().setTo(themeObject); } break; default: break; } } 

He recibido el objeto del tema del tema paquete e intento setTheme de la aplicación de la preferencia. Pero no funciona. Por favor, ayúdame que: cómo establecer el tema de la aplicación de otros a mi aplicación actual mediante programación.

Si desea cambiar la configuración en una aplicación de otra, probablemente la manera más fácil de hacerlo es poner un ID de tema en una intención y enviar esa intención a su MainActivity (oa un IntentService) donde la aplicación receptora puede procesar los datos . Por ejemplo, cuando llega la intención, puede procesarla como lo hace un evento de clic en su lógica "onClick".

Por ejemplo, una aplicación puede crear una intención como esta:

  Intent intent = new Intent("android.intent.action.MAIN"); intent.setComponent(new ComponentName("your.package", "your.package.component")); intent.putExtra("theme_id", "theme_1"); startActivity(intent); 

Luego, en su actividad, use getIntent().getStringExtra("theme_id") para obtener los datos pasados ​​a su aplicación.

Debería utilizar los recursos de la aplicación para cargar el tema. He respondido esto en otro hilo aquí: https://stackoverflow.com/a/41948943/1048340

Aquí está un ejemplo donde está instalado el paquete "com.example.theme" y usamos los recursos de la aplicación y el estilo del tema en otra aplicación:

 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; } } 

Vea aquí para un proyecto de trabajo en GitHub.


Esto puede dar lugar a problemas porque todos los diseños, dibujos, cadenas, etc. se cargarán desde los recursos de la otra aplicación. Por lo tanto, debe evitar el uso de un tema de otro paquete y en su lugar copiar los recursos y el tema a su propio proyecto.

  • ¿Dónde puedo encontrar todos los temas de Android incorporados?
  • Cómo configurar width / height para cualquier widget a través de Theme en Android
  • Android: clipToPadding no funciona desde el tema, pero funciona como un estilo
  • ¿Por qué es tan complejo configurar estilo de código en Android
  • ¿Cómo cambiar o agregar un tema a Android Studio?
  • Separación de recursos / archivos a diferentes apk para pelar
  • Cómo aplicar un tema dependiendo de la versión de Android
  • Cambiar el color de la barra de acciones de Android 5.0
  • Uso de un tema para la pantalla de preferencias
  • Problema de Android con la implementación de temas personalizados
  • Toque fuera del cuadro de diálogo de Android para descartarlo?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.