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


Crear una DialogPreference desde XML

He estado intentando utilizar un android.preference.DialogPreference hinchado de XML, pero la documentación parece estar faltando algunos bits esenciales, y no puedo encontrar un ejemplo de trabajo en cualquier lugar. Mi XML ahora se parece a esto (he intentado muchas permutaciones pero esto parece un mínimo razonable):

 <DialogPreference android:key="funThing" android:title="Fun Thing" android:dialogLayout="@layout/fun_layout" android:positiveButtonText="OK" android:negativeButtonText="Cancel" /> 

Mi suposición en este punto es que es necesario subclasificar DialogPreference y no usarlo directamente. Por un lado, no puedo encontrar una manera de asociar el valor de preferencia real con un elemento en el diálogo en sí, que a la reflexión es una especie de regalo. Y también, mirando la fuente a DialogPreference.java parece confirmarlo. Y también acabo de notar que la documentación oficial se refiere a ella como una "clase base". Pero al menos, sería bueno establecer una fuente definitiva suficiente en la red que ayudaría a los N siguientes personas a entender esto más rápido que yo.

Para el registro, el archivo de registro se ve así:

 I/ActivityManager( 61): Starting: Intent { cmp=org.jeremy.android/.PreferencesActivity } from pid 2755 W/Resources( 2755): Converting to string: TypedValue{t=0x10/d=0x4b0 a=-1} W/Resources( 2755): Converting to string: TypedValue{t=0x10/d=0x20 a=-1} D/AndroidRuntime( 2755): Shutting down VM W/dalvikvm( 2755): threadid=1: thread exiting with uncaught exception (group=0x40015560) E/AndroidRuntime( 2755): FATAL EXCEPTION: main E/AndroidRuntime( 2755): java.lang.RuntimeException: Unable to start activity ComponentInfo{org.jeremy.android/org.jeremy.android.PreferencesActivity}: android.view.InflateException: Binary XML file line #28: Error inflating class java.lang.reflect.Constructor E/AndroidRuntime( 2755): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1647) E/AndroidRuntime( 2755): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663) E/AndroidRuntime( 2755): at android.app.ActivityThread.access$1500(ActivityThread.java:117) E/AndroidRuntime( 2755): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931) E/AndroidRuntime( 2755): at android.os.Handler.dispatchMessage(Handler.java:99) E/AndroidRuntime( 2755): at android.os.Looper.loop(Looper.java:123) E/AndroidRuntime( 2755): at android.app.ActivityThread.main(ActivityThread.java:3683) E/AndroidRuntime( 2755): at java.lang.reflect.Method.invokeNative(Native Method) E/AndroidRuntime( 2755): at java.lang.reflect.Method.invoke(Method.java:507) E/AndroidRuntime( 2755): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) E/AndroidRuntime( 2755): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) E/AndroidRuntime( 2755): at dalvik.system.NativeStart.main(Native Method) E/AndroidRuntime( 2755): Caused by: android.view.InflateException: Binary XML file line #28: Error inflating class java.lang.reflect.Constructor E/AndroidRuntime( 2755): at android.preference.GenericInflater.createItem(GenericInflater.java:397) E/AndroidRuntime( 2755): at android.preference.GenericInflater.onCreateItem(GenericInflater.java:417) E/AndroidRuntime( 2755): at android.preference.GenericInflater.createItemFromTag(GenericInflater.java:428) E/AndroidRuntime( 2755): at android.preference.GenericInflater.rInflate(GenericInflater.java:481) E/AndroidRuntime( 2755): at android.preference.GenericInflater.rInflate(GenericInflater.java:493) E/AndroidRuntime( 2755): at android.preference.GenericInflater.inflate(GenericInflater.java:326) E/AndroidRuntime( 2755): at android.preference.GenericInflater.inflate(GenericInflater.java:263) E/AndroidRuntime( 2755): at android.preference.PreferenceManager.inflateFromResource(PreferenceManager.java:251) E/AndroidRuntime( 2755): at android.preference.PreferenceActivity.addPreferencesFromResource(PreferenceActivity.java:262) E/AndroidRuntime( 2755): at org.jeremy.android.PreferencesActivity.onCreate(PreferencesActivity.java:40) E/AndroidRuntime( 2755): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) E/AndroidRuntime( 2755): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611) E/AndroidRuntime( 2755): ... 11 more E/AndroidRuntime( 2755): Caused by: java.lang.InstantiationException: android.preference.DialogPreference E/AndroidRuntime( 2755): at java.lang.reflect.Constructor.constructNative(Native Method) E/AndroidRuntime( 2755): at java.lang.reflect.Constructor.newInstance(Constructor.java:415) E/AndroidRuntime( 2755): at android.preference.GenericInflater.createItem(GenericInflater.java:383) E/AndroidRuntime( 2755): ... 22 more W/ActivityManager( 61): Force finishing activity org.jeremy.android/.PreferencesActivity W/ActivityManager( 61): Force finishing activity org.jeremy.android/.SplashActivity 

  • Disposición de la pantalla de preferencias de Android
  • ¿Qué es las herramientas: layout en el fragmento de archivo xml?
  • Eliminar una cadena en todos los idiomas Android
  • ((Botón)) dentro de un servicio no funciona
  • Cómo agregar etiquetas en xml en android? Y cómo guardar ese archivo xml?
  • Android Studio: Problemas de renderización
  • Android: no se puede obtener valor de EditText dentro de Custom Dialog
  • Atributos XML del diseño de combinación a RelativeLayout a través de inflar
  • 3 Solutions collect form web for “Crear una DialogPreference desde XML”

    Este es extraño, necesita subclase DialogPreference . La subclase no necesita hacer nada. Asi que

     public class MyDialogPreference extends DialogPreference { public MyDialogPreference(Context context, AttributeSet attrs) { super(context, attrs); // TODO Auto-generated constructor stub } } 

    Puede ser instanciado. Mientras que un avión viejo DialogPreference no puede. Muy raro, deben ser exactamente lo mismo.

    A continuación se muestra un ejemplo de cómo utilizar la preferencia de diálogo (subclase como mencionó).

     package dk.myapp.views; import android.content.Context; import android.preference.DialogPreference; import android.util.AttributeSet; /** * The OptionDialogPreference will display a dialog, and will persist the * <code>true</code> when pressing the positive button and <code>false</code> * otherwise. It will persist to the android:key specified in xml-preference. */ public class OptionDialogPreference extends DialogPreference { public OptionDialogPreference(Context context, AttributeSet attrs) { super(context, attrs); } @Override protected void onDialogClosed(boolean positiveResult) { super.onDialogClosed(positiveResult); persistBoolean(positiveResult); } } 

    Preferences.xml debe contener

     <dk.myapp.views.OptionDialogPreference android:key="@string/prefKeyResetQuests" android:dialogIcon="@android:drawable/ic_dialog_alert" android:title="Reset Quests" android:summary="Reset all quest-progress." android:dialogMessage="Are you sure you wish to reset your quest progress? This action cannot be undone!" android:positiveButtonText="Clear Quests" android:negativeButtonText="Cancel"/> 

    Tengo una res / valor que contiene (aunque el nombre-clave también se puede declarar explícitamente arriba).

     <string name="prefKeyResetQuests">resetQuests</string> 

    Mi PreferenceActivity realiza el restablecimiento real desde onPause. Tenga en cuenta que onStop puede ser demasiado tarde ya que el onStop no siempre se llamará inmediatamente después de pulsar de nuevo:

     @Override public void onPause() { SharedPreferences prefs = android.preference.PreferenceManager. getDefaultSharedPreferences(getBaseContext()); if(prefs.getBoolean( getResources().getString(R.string.prefKeyResetQuests), false)) { // apply reset, and then set the pref-value back to false } } 

    O de manera equivalente ya que todavía estamos en la preferenciaActividad:

     @Override protected void onPause() { Preference prefResetQuests = findPreference(getResources().getString(R.string.prefKeyResetQuests)); if(prefResetQuests.getSharedPreferences(). getBoolean(prefResetQuests.getKey(), false)){ // apply reset, and then set the pref-value back to false } } 

    Primero:

    Cree su propia clase que extiende DialogPreference como bellow:

     package com.test.view; import android.preference.DialogPreference; public class DialogExPreference extends DialogPreference { public DialogExPreference(Context oContext, AttributeSet attrs) { super(oContext, attrs); } } 

    Segundo:

    Modifique el archivo xml como sigue:

     <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> <com.test.view.DialogExPreference android:title="@string/title" android:dialogMessage="@string/lite" android:negativeButtonText="test"/> </PreferenceScreen> 

    Entonces está bien.

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