PreferenceFragment OnPreferenceClickListener () only works once

I implement a custom Preferenceone that will behave similarly to a button (preference will open a dialog to restore default values ​​for all settings). It works great if you click on the button ResetPreferencethat displays the dialog, and if you press positively, all preference data is cleared and reset , but if you click on the button ResetPreference, nothing will happen. I believe that PreferenceScreensomething is wrong when setting the parameter to zero and re-add resources.

If you ask why I used this approach, I wanted to click on reset and immediately show the result of the change, if anyone knows the best way to implement reset, please give a small example.

PS: If you click on ResetPreferenceand select the negative button, nothing happens and the listener is still functioning, so it really needs to delete something and re-add resources.

ResetPreference.java

public class ResetPreference extends Preference {

public ResetPreference(Context context, AttributeSet attrs) {
    super(context, attrs);

    setOnPreferenceClickListener(new OnPreferenceClickListener() {

        public boolean onPreferenceClick(Preference preference) {
            AlertDialog.Builder builder = new AlertDialog.Builder(getContext());
            builder.setTitle(R.string.prefAlertDialog_Title);   
            builder.setMessage(R.string.prefAlertDialog_Message);
            builder.setPositiveButton(R.string.prefAlertDialog_Positive, new OnClickListener() {

                public void onClick(DialogInterface dialog, int which) {
                    SettingsFragment.resetSettings(getContext());   
                }
            });
            builder.setNegativeButton(R.string.prefAlertDialog_Negative, null);
            builder.create().show();

            return false;
        }
    });

}}

Then there is my custom PreferenceFragment SettingsFragment.java

public class SettingsFragment extends PreferenceFragment{

private static SettingsFragment sf = null;

 public static void resetSettings(Context ctx)
 {

    PreferenceManager
    .getDefaultSharedPreferences(ctx)
    .edit()
    .clear()
    .commit();
    PreferenceManager.setDefaultValues(ctx, R.xml.preferences, true);           

    if(sf != null)
    {
        sf.setPreferenceScreen(null);
        sf.addPreferencesFromResource(R.xml.preferences);   
    }
 }

 public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        sf = this;

        // Load the preferences from an XML resource
        addPreferencesFromResource(R.xml.preferences);

        Preference reset = (Preference) findPreference("reset");

        reset.setOnPreferenceClickListener(new OnPreferenceClickListener()
        {
            public boolean onPreferenceClick(Preference pref)
            {           

                AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
                builder.setTitle(R.string.prefAlertDialog_Title);   
                builder.setMessage(R.string.prefAlertDialog_Message);
                builder.setPositiveButton(R.string.prefAlertDialog_Positive, new OnClickListener() {

                    public void onClick(DialogInterface dialog, int which) {
                        PreferenceManager
                        .getDefaultSharedPreferences(getActivity().getApplicationContext())
                        .edit()
                        .clear()
                        .commit();
                        PreferenceManager.setDefaultValues(getActivity().getApplicationContext(), R.xml.preferences, true);             

                        setPreferenceScreen(null);
                        addPreferencesFromResource(R.xml.preferences);                      
                    }
                });
                builder.setNegativeButton(R.string.prefAlertDialog_Negative, null);
                builder.create().show();


                return true;
            }
        });
 } 

 @Override
public void onStop() {
    super.onStop();
    sf = null;
}}

After you add the sentence, https://stackoverflow.com/a/166708/270770 ... everything is done in SettingsFragment. ResetPreferenceno longer needed, and standard android can be used instead Preference.

The only code needed to implement the reset button is in this updated

SettingsFragment.java

public class SettingsFragment extends PreferenceFragment{

private void addMyResetListener() {
    Preference reset = (Preference) findPreference("reset");

    reset.setOnPreferenceClickListener(new OnPreferenceClickListener()
    {
        public boolean onPreferenceClick(Preference pref)
        {           

            AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
            builder.setTitle(R.string.prefAlertDialog_Title);   
            builder.setMessage(R.string.prefAlertDialog_Message);
            builder.setPositiveButton(R.string.prefAlertDialog_Positive, new OnClickListener() {

                public void onClick(DialogInterface dialog, int which) {
                    resetSettings(SettingsFragment.this.getActivity());             
                }
            });
            builder.setNegativeButton(R.string.prefAlertDialog_Negative, null);
            builder.create().show();

            return true;
        }
    });
}

public void resetSettings(Context ctx)
{   
    //Remove all Settings 
    PreferenceManager
    .getDefaultSharedPreferences(ctx)
    .edit()
    .clear()
    .commit();
    //All Settings that are empty will be loaded from default values again
    PreferenceManager.setDefaultValues(ctx, R.xml.preferences, true);           

    setPreferenceScreen(null);
    addPreferencesFromResource(R.xml.preferences);  
    addMyResetListener();
}

public void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);

       // Load the preferences from an XML resource & add listener
       addPreferencesFromResource(R.xml.preferences);
       addMyResetListener();
} }
+4
1

setPreferenceScreen(null);, . , addPreferencesFromResource(R.xml.preferences);, , .

, Preference reset, !

private void addMyResetListener() {
    Preference reset = (Preference) findPreference("reset");

    reset.setOnPreferenceClickListener(new OnPreferenceClickListener()
    {
        public boolean onPreferenceClick(Preference pref)
        {           

            resetSettings(SettingsFragment.this.getActivity());


            return true;
        }
    });
}

setPreferenceScreen(null);
addPreferencesFromResource(R.xml.preferences);
addMyResetListener();

resetSettings

 public void resetSettings(Context ctx) // also removed static
 {

    PreferenceManager
    .getDefaultSharedPreferences(ctx)
    .edit()
    .clear()
    .commit();
    PreferenceManager.setDefaultValues(ctx, R.xml.preferences, true);           

    setPreferenceScreen(null);
    addPreferencesFromResource(R.xml.preferences);   
    addMyResetListener();
 }

, ResetPreference

+3

Source: https://habr.com/ru/post/1547702/


All Articles