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:
- Por qué mi animación de actividad cercana no funciona en Android 4.0 (ICS)
- No apuntar a las últimas versiones de Android
- Aplicar estilo de Android a TextView personalizado
- ¿Cómo configurar diferentes temas para el selector de botones?
- Android: Cómo establecer programaticamente el tema de una actividad en Theme.Dialog
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.
- ¿Cómo puedo hacer que la barra de estado sea blanca con iconos negros?
- Establecer tema personalizado en la lista de preferencias de Android
- Android: Utiliza diferentes estilos después de elegir un tema diferente, manteniendo las mismas referencias
- Obtener valores de atributo predeterminados de un tema de Android en tiempo de ejecución?
- Cómo cambiar el color del hilandero, el texto y el botón del material AlertDialog y ProgressDialog
- TextView de Android cambia textColor con tema
- Aplicación dinámica del estilo
- Actividad que se mostrará incluso cuando el teléfono esté en modo bloqueado
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.