creating a DialogPreference from XML

后端 未结 3 1906
旧时难觅i
旧时难觅i 2020-11-30 01:39

I have been attempting to use an android.preference.DialogPreference inflated from XML, but the documentation seems to be missing some essential bits, and I can

相关标签:
3条回答
  • 2020-11-30 02:16

    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:

    @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
        }
    }
    

    Or equivalently since we are still in the PreferenceActivity:

    @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 
        }
    }
    
    0 讨论(0)
  • 2020-11-30 02:26

    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.

    0 讨论(0)
  • 2020-11-30 02:39

    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.

    0 讨论(0)
提交回复
热议问题