4

Previously, I'm using PreferenceFragment. Hence, to invoke a custom dialog from PreferenceFragment, I will use DialogPreference as following.

ScanSpeedDialogPreference.java

import android.preference.DialogPreference;

public class ScanSpeedDialogPreference extends DialogPreference {

    public ScanSpeedDialogPreference(Context context, AttributeSet attrs) {
        super(context, attrs);
        setDialogLayoutResource(R.layout.scan_speed_dialog_preference);
    }

    public ScanSpeedDialogPreference(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        setDialogLayoutResource(R.layout.scan_speed_dialog_preference);
    }   

    @SuppressLint("NewApi")
    @Override
    protected View onCreateDialogView() {
        View view = super.onCreateDialogView();

        // Perform all UI fine tuning and event handler installation...

        return view;
    }

    // http://stackoverflow.com/questions/13851554/why-custom-dialogpreference-doesnt-trigger-on-onsharedpreferencechanged-listener
    @Override
    protected void onDialogClosed(boolean positiveResult) {
        super.onDialogClosed(positiveResult);
        if (positiveResult) {
            persistBoolean(!getPersistedBoolean(true));
        }
    } 
}

Recently, I'm under migration code from PreferenceFragment to android.support.v7.preference.PreferenceFragmentCompat.

Hence, I can no longer use DialogPreference.

I need a class, which is subsclass from android.support.v7.preference.Preference

I try to change my DialogPreference, to the following

ScanSpeedDialogPreference.java

import android.support.v7.preference.DialogPreference;

public class ScanSpeedDialogPreference extends DialogPreference {

    public ScanSpeedDialogPreference(Context context, AttributeSet attrs) {
        super(context, attrs);
        setDialogLayoutResource(R.layout.scan_speed_dialog_preference);
    }

    public ScanSpeedDialogPreference(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        setDialogLayoutResource(R.layout.scan_speed_dialog_preference);
    }   

    @SuppressLint("NewApi")
    @Override
    protected View onCreateDialogView() {
        View view = super.onCreateDialogView();

        // Perform all UI fine tuning and event handler installation...

        return view;
    }

    // http://stackoverflow.com/questions/13851554/why-custom-dialogpreference-doesnt-trigger-on-onsharedpreferencechanged-listener
    @Override
    protected void onDialogClosed(boolean positiveResult) {
        super.onDialogClosed(positiveResult);
        if (positiveResult) {
            persistBoolean(!getPersistedBoolean(true));
        }
    } 
}

However, 2 problems arise.

  1. v7 DialogPreference doesn't have onCreateDialogView.
  2. v7 DialogPreference doesn't have onDialogClosed.

I was wondering, what is the proper way, to achieve similar functionality of onCreateDialogView and onDialogClosed in v7 DialogPreference?

Cheok Yan Cheng
  • 47,586
  • 132
  • 466
  • 875

1 Answers1

3

When using support library, please do not use DialogPreference. Instead, we should use PreferenceDialogFragmentCompat.

For detailed information, please refer to Adding toolbar to PreferenceActivity via AppCompatPreferenceActivity causes overlapping

Community
  • 1
  • 1
Cheok Yan Cheng
  • 47,586
  • 132
  • 466
  • 875