自定义DialogPreference的默认值是null。

3

我有一个继承自DialogPreferenceTimePreference类。我使用了3个NumberPicker来设置小时、分钟和秒钟。这个方法很好用。但是当调用onSetInitialValue时,defaultValue总是null。而onGetDefaultValue返回在首选项中定义的正确值。你有什么想法吗?

public TimePreference(Context ctxt, AttributeSet attrs, int defStyle) {
    super(ctxt, attrs, defStyle);

    setPositiveButtonText(R.string.ok);
    setNegativeButtonText(R.string.cancel);
    setDialogLayoutResource(R.layout.time_preference_layout);
}

@Override
protected void onBindDialogView(View v) {
    super.onBindDialogView(v);

    mHoursPicker = (NumberPicker)v.findViewById(R.id.hours);
    mHoursPicker.setMinValue(0);
    mHoursPicker.setMaxValue(23);
    mHoursPicker.setFormatter(TWO_DIGIT_FORMATTER);

    mMinutesPicker = (NumberPicker)v.findViewById(R.id.minutes);
    mMinutesPicker.setMinValue(0);
    mMinutesPicker.setMaxValue(59);
    mMinutesPicker.setFormatter(TWO_DIGIT_FORMATTER);

    mSecondsPicker = (NumberPicker)v.findViewById(R.id.seconds);
    mSecondsPicker.setMinValue(0);
    mSecondsPicker.setMaxValue(59);
    mSecondsPicker.setFormatter(TWO_DIGIT_FORMATTER);
}

@Override
protected void onDialogClosed(boolean positiveResult) {
    super.onDialogClosed(positiveResult);

    if (positiveResult) {
        long currentTimeInMillis = convertTimeToMillis();

        if (callChangeListener(currentTimeInMillis)) {
            persistLong(currentTimeInMillis);
            notifyChanged();
        }
    }
    CharSequence summary = getSummary();
    setSummary(summary);
}
@Override
protected Object onGetDefaultValue(TypedArray a, int index) {
    super.onGetDefaultValue(a, index);
    return a.getString(index);
}

@Override
protected void onSetInitialValue(boolean restoreValue, Object defaultValue) {
    super.onSetInitialValue(restoreValue, defaultValue);

    long value = 0;

    if (restoreValue) {
        if (defaultValue == null) {
            Log.d( "bla", "No default value defined!");
        } else {
            value = Long.parseLong(getPersistedString((String) defaultValue));
        }
    } else {
        if (defaultValue == null) {
            Log.d( "bla", "No default value defined!");
        } else {
            value = Long.parseLong((String) defaultValue);
        }
    }

    String result = convertMillisToTime(value);
    setSummary(result);
}


@Override
public CharSequence getSummary() {
    if (mHoursPicker == null) {
        return null;
    }
    return convertTimeToString( mHoursPicker.getValue(), mMinutesPicker.getValue(), mSecondsPicker.getValue());
}

}


提升一下,没有建议吗? - KayJ
1个回答

0

为什么不尝试手动设置默认值呢?如果您要将此时间值保存到sharedPreferences中,可以在PreferenceScreen的xml声明中指定它:

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <PreferenceCategory
        android:title="@string/pref_cat_general"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <to.marcus.rxtesting.ui.widgets.ChoicePreference
            android:key="@string/pref_key_sel_time"
            android:title="@string/pref_title_time"
            android:summary="set time"/>

注意自定义偏好设置ChoicePreference。一旦声明了这个类,你可以在它自己的类中定义它,就像你之前通过扩展DialogPreference所做的那样。
public class ChoicePreference extends DialogPreference {
    public ChoicePreference(Context context, AttributeSet attrs){
        super(context,attrs);
    }

    @Override
    protected void onClick(){
        AlertDialog.Builder dialog = new AlertDialog.Builder(getContext());
        dialog.setTitle("Check Time");
        dialog.setMessage("confirm time:");
        dialog.setCancelable(true);
        dialog.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                Toast.makeText(getContext(), "time set!",    Toast.LENGTH_SHORT).show();
                putPrefValue("key_sel_time",true);
            }
        });

putPrefValue(key,value) 方法将会写入/覆盖你的 sharedPreference 值:

private void putPrefValue(String key, boolean value){
    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getContext());
    SharedPreferences.Editor editor = prefs.edit();
    //removes existing key to trigger change listener
    editor.remove(key);
    editor.commit();
    editor.putBoolean(key, value);
    editor.apply();
}

接下来,您需要使用Activity监听sharedPreference更改。例如:

1)为您的sharedPrefs设置一个监听变量:

    private static SharedPreferences sharedPrefs;
    private static SharedPreferences.OnSharedPreferenceChangeListener mListener;

2.) 注册/注销监听器
@Override
protected void onResume() {
    super.onResume();
    sharedPrefs.registerOnSharedPreferenceChangeListener(mListener);
}

@Override
protected void onPause() {
    super.onPause();
    sharedPrefs.unregisterOnSharedPreferenceChangeListener(mListener);
}

3.) 获取一个实例并对结果进行操作/更改

 private void initSharedPrefsListener(){
        sharedPrefs = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
        mListener = new SharedPreferences.OnSharedPreferenceChangeListener(){
            @Override
            public void onSharedPreferenceChanged(SharedPreferences sharedPrefs, String key){
                mBasePresenterImpl.onPrefSelected(key, sharedPrefs.getString(key, "default value here"));
        }
    };
}

这里的onPrefSelected方法是概念性的。您可以获取结果值并将其持久化为JsonString。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接