studio preferencefragmentcompat example dialogpreference custom activity android themes android-preferences

android - dialogpreference - preferencefragmentcompat example



PreferenciaActividad y tema no aplicable. (5)

Alguien acaba de publicar una solución en http://code.google.com/p/android/issues/detail?id=4611

En pocas palabras, las pantallas de preferencias de nivel superior parecen reconocer el tema pero las anidadas no. Así que la solución alternativa recomienda crear PreferenceActivity de nivel superior para PreferenceScreen anidado y luego invocar esta nueva actividad a través de la intención:

<PreferenceScreen android:key="key1" android:title="1 Item" android:summary=""> <intent android:action="android.intent.action.VIEW" android:targetPackage="com.example" android:targetClass="com.example.PreferenceActivity2"/> </PreferenceScreen>

No tuve que aplicar el tema a nada más que a la propia aplicación.

Hola a todos, he puesto el tema en el archivo de manifiesto de esta manera:

android:theme="@android:style/Theme.Light"

Pero tengo un problema en la Actividad de Preferencias, en las preferencias principales el tema se muestra bien, pero si llego a una sub preferencia, el tema se vuelve desordenado, no es blanco como debería, todo está oscuro y la fuente es negro, así que no puedes ver mucho, y cuando empiezo a hacer clic en cualquier elemento, a veces se vuelven blancos como deberían pero luego vuelven a ser negros. Esto solo sucede en 2.1, tanto en el dispositivo real como en el emulador. Probado en el emulador ejecutando 1.6 y estaba funcionando correctamente. Aquí es parte del código del archivo xml de preferencias:

<?xml version="1.0" encoding="utf-8"?> <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> <PreferenceScreen android:title="@string/account"> <CheckBoxPreference android:key="enable_account" android:title="@string/account_use" android:summary="@string/account_summ" /> <EditTextPreference android:key="username" android:title="@string/login" android:dependency="enable_account" android:summary="@string/login_summ" /> <EditTextPreference android:key="password" android:title="@string/password" android:dependency="enable_account" android:summary="@string/password_summ" android:password="true" /> </PreferenceScreen>

Y aquí hay una captura de pantalla:

texto alt http://i39.tinypic.com/16hnhh3.png

¿Alguna solución?



Finalmente, descubrí cómo cambiar el tema de "PreferenceActivity" programáticamente (a través de código java)

Para cambiar el tema hazlo así:

@Override public void onCreate(Bundle savedInstanceState) { setTheme(R.style.Holo_Theme_Light); super.onCreate(savedInstanceState); }

Siempre llame a setTheme(R.style.yourtheme); método antes de super.onCreate(savedInstanceState); método. Al hacer esto producirá el resultado como se muestra a continuación.

Eso es todo.

Si llamas setTheme(R.style.yourtheme); método después de super.onCreate(savedInstanceState); método que producirá resultado como se muestra a continuación.

Nota: los temas no son reconocidos por PreferenceScreen anidado. Para aplicar el tema a esa Pantalla de Preferencia anidada, tiene que hacer otra setTheme(R.style.yourtheme); Preferencia para esa setTheme(R.style.yourtheme); Preferencia y llamar a setTheme(R.style.yourtheme); método allí.


Hay una solución aún más fácil, si estás de acuerdo con usar lo que parece magia negra para lograr esto ...

Al PreferenceScreen#showDialog(Bundle) el origen de PreferenceScreen#showDialog(Bundle) , vemos que el diálogo se crea utilizando el recurso de tema obtenido a través de mContext.getThemeResId() , que luego se usa en ContextThemeWrapper .

Esto nos puede ayudar sustancialmente, porque el Context se usa en PreferenceScreen es en realidad nuestra getThemeResId() PreferenceActivity , por lo que todo lo que tenemos que hacer es anular el método getThemeResId() (que está oculto de la API pública), para proporcionar nuestro tema personalizado y ¡Sub-PreferenceScreen ahora usa cualquier recurso de tema personalizado que queríamos!

/** * This is a hack to provide our own theme for the PreferenceScreen''s dialog. * * @see android.preference.PreferenceScreen#showDialog(Bundle) */ public int getThemeResId() { return R.style.Theme_MyApp_PreferenceScreen; }

Tenga en cuenta que debido a que este método está anotado con @hide , no podemos usar la anotación @Override que normalmente se usaría en este caso; y tampoco podemos llamar al método super.getThemeResId() . Si realmente quieres poder anular esto de manera condicional y llamar a la súper implementación como alternativa, tendrás que usar Reflection para llegar al método de la súper implementación:

try { ((Object) this).getClass().getMethod("getThemeResId").invoke(this); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } catch (NoSuchMethodException e) { e.printStackTrace(); }


También puede utilizar esta técnica para anular los estilos de las pantallas de preferencias internas:

@Override public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) { super.onPreferenceTreeClick(preferenceScreen, preference); if (preference != null) { if (preference instanceof PreferenceScreen) { if (((PreferenceScreen) preference).getDialog() != null) { ((PreferenceScreen) preference) .getDialog() .getWindow() .getDecorView() .setBackgroundDrawable( this .getWindow() .getDecorView() .getBackground() .getConstantState() .newDrawable() ); } } } return false; }

Este código aplica el estilo de la pantalla de preferencias principal a la pantalla de preferencias pulsada.