creating a DialogPreference from XML
Here is an example of how to use the dialog preference (subclassing as you mentioned).
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); }}
The preferences.xml should contain
<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"/>
I have a res/value containing (though the key-name can also be declared explicitly above).
<string name="prefKeyResetQuests">resetQuests</string>
My PreferenceActivity does the actual resetting from onPause. Note that onStop may be too late since the onStop will not always be called immediately after pressing back:
@Overridepublic 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 }}
Or equivalently since we are still in the PreferenceActivity:
@Overrideprotected 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 }}
This one is weird, you need to subclass DialogPreference
. The subclass does not need to do anything. So
public class MyDialogPreference extends DialogPreference { public MyDialogPreference(Context context, AttributeSet attrs) { super(context, attrs); // TODO Auto-generated constructor stub }}
can be instantiated. While a plane old DialogPreference
can not. Very weird, they should be the exact same thing.
First:
Create your own class which extends DialogPreference
as bellow:
package com.test.view;import android.preference.DialogPreference;public class DialogExPreference extends DialogPreference { public DialogExPreference(Context oContext, AttributeSet attrs) { super(oContext, attrs); }}
Second:
Modify the xml file as bellow:
<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>
Then it's OK.