la création d'un DialogPreference à partir de XML
Je tente d'utiliser un android.preference.DialogPreference
gonflés à partir de XML, mais la documentation semble manquer un certain nombre de bits, et je ne peux pas trouver un exemple de travail de n'importe où. Mon XML ressemble maintenant à ceci (j'ai essayé plusieurs combinaisons mais cela semble être un minimum raisonnable):
<DialogPreference
android:key="funThing" android:title="Fun Thing"
android:dialogLayout="@layout/fun_layout"
android:positiveButtonText="OK"
android:negativeButtonText="Cancel"
/>
Ma supposition à ce point, c'est qu'il est nécessaire à la sous-classe DialogPreference
et de ne pas l'utiliser directement. Pour l'un, je ne peux pas trouver un moyen d'associer la réelle valeur de préférence avec un élément dans la boîte de dialogue elle-même, qui, lors de la réflexion est une sorte de cadeau. Et aussi, en regardant la source de DialogPreference.java
semble le confirmer. Et je viens de remarquer que la documentation officielle se réfère à elle comme une "classe de base". Mais au moins, il serait bien d'établir un définitif-source assez sur le net qui serait le prochain N les gens à comprendre plus vite que je l'ai fait.
Pour l'enregistrement, le fichier ressemble à ceci:
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
Vous devez vous connecter pour publier un commentaire.
C'est bizarre, vous avez besoin de sous-classe
DialogPreference
. La sous-classe n'a pas besoin de faire quoi que ce soit. Doncpeut être instancié. Alors qu'un avion vieux
DialogPreference
ne peut pas. Très bizarre, ils devraient être exactement la même chose.Voici un exemple d'utilisation de la boîte de dialogue préférences (sous-classement, comme vous l'avez mentionné).
L'preferences.xml doit contenir
J'ai un res/valeur contenant (bien que le nom de clé peut également être déclaré explicitement ci-dessus).
Mon PreferenceActivity effectue la réinitialisation de onPause. Notez que onStop peut-être trop tard depuis le onStop ne sera pas toujours être appelé immédiatement après avoir appuyé sur retour:
Ou, de manière équivalente, puisque nous sommes encore dans la PreferenceActivity:
Première:
Créer votre propre classe qui s'étend
DialogPreference
comme ci-dessous:Deuxième:
Modifier le fichier xml comme ci-dessous:
Alors c'est OK.