androidandroidxandroid-preferenceslistpreference

Androidx: Cannot resolve method 'getDialog' in 'ListPreference'


I have used a custom ListPreference which worked well before. Then upgrading to Androidx, it appears this error:

import androidx.preference.ListPreference;
....
public static class myPreferenceFragment extends PreferenceFragmentCompat implements SharedPreferences.OnSharedPreferenceChangeListener {
...
ListPreference coustomListPreference = (ListPreference) findPreference("list_XXXX");
coustomListPreference.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
   public boolean onPreferenceClick(Preference preference) {
      ... 
      if(!XXXXPermissionGranted(): when users don't grant some Permission, causing this ListPreference to have nothing to show) 
       coustomListPreference.getDialog().dismiss();
   }

> Cannot resolve method 'getDialog' in 'ListPreference'

I've searched this topic and I cannot find a straight answer.


Solution

  • For Androidx, it needs to do these things in addition to your PreferenceFragmentCompat to accomplish the coustomListPreference.getDialog().dismiss() in the question statements.

    This could be a template if you want to make the dialog dismiss or to customize the Entries/Values of the ListPreference.

    public static class myDialogPrefFragCompat extends PreferenceDialogFragmentCompat {
            public static myDialogPrefFragCompat newInstance(String key) {
                final myDialogPrefFragCompat fragment = new myDialogPrefFragCompat();
                final Bundle bundle = new Bundle(1);
                bundle.putString(ARG_KEY, key);
                fragment.setArguments(bundle);
                return fragment;
            }
            @Override
            public void onDialogClosed(boolean positiveResult) {
                if (positiveResult) {
                    // do things
                }
            }
    }
    
    public static class myPreferenceFragment extends PreferenceFragmentCompat implements SharedPreferences.OnSharedPreferenceChangeListener {
        ...
    private static final String DIALOG_FRAGMENT_TAG = "myDialogPreference";
            @Override
            public void onDisplayPreferenceDialog(Preference preference) {
                if (getParentFragmentManager().findFragmentByTag(DIALOG_FRAGMENT_TAG) != null) {
                    return;
                }
    
                if (preference instanceof ListPreference) {
                    if (preference.getKey().equals("list_XXXX")){
    
                        initXXXXPermissionToGo(); //Request Android Permission such like Contacts etc. for customizing the Entries/Values of the ListPreference
                        if(XXXXPermissionGranted())
                            super.onDisplayPreferenceDialog(preference);
                        /*else
                            super.onDisplayPreferenceDialog(preference); 
    when the Permission not granted, nothing can be set in ListPreference Entries/Values, and there's no need to see it. This equals 
    coustomListPreference.getDialog().dismiss() in the question*/
                    }else
                        super.onDisplayPreferenceDialog(preference);
                } else {
                    super.onDisplayPreferenceDialog(preference);
                }
            }
    ...