自定义对话框preference的默认值为null [英] Default value of custom DialogPreference is null

查看:429
本文介绍了自定义对话框preference的默认值为null的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个时preference 类,从派生对话框preference 。我使用3 NumberPicker 设定小时,分钟和秒。这工作得很好。但是,当被称为 onSetInitialValue 设置defaultValue 总是。而 onGetDefaultValue 返回在preferences定义正确的值。任何想法有什么不好?

I have a TimePreference class that derives from DialogPreference. I'm using 3 NumberPicker to set hours, minutes and seconds. This works fine. But when onSetInitialValue is called defaultValue is always null. Whereas onGetDefaultValue returns the correct value that is defined in the preferences. Any ideas what is wrong?

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());
}

}

推荐答案

你为什么不尝试手动设置的默认值?如果要保存的时间价值,共享preferences,您可以在preferenceScreen你的XML声明中指定的:

Why don't you try setting the default value manually? If you are saving this time value to sharedPreferences, you can specify it in your xml declaration of a PreferenceScreen:

<?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"/>

注意定制preference 选择preference 。一旦这个声明,您可以在自己的类定义它,类似于你通过扩展对话框preference上面做了什么:

Notice the custom preference ChoicePreference. Once this is declared, you can define it in its own class, similarly to what you've done above by extending 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);
            }
        });

把prefValue(键,值)方式将写入/覆盖您的共享preference值:

The putPrefValue(key,value) method will write/overwrite your sharedPreference value:

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();
}

然后,从这个角度,你会需要你的活动,比如听这些共享preference变化:

Then from this point you'll need your Activity, for instance, to listen to these sharedPreference changes:

1)设置监听器变量为共享preFS:

1.) set a listener variable for your sharedPrefs:

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

2)注册/注销监听器

2.) register/unregister the listener

@Override
protected void onResume() {
    super.onResume();
    sharedPrefs.registerOnSharedPreferenceChangeListener(mListener);
}

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

3)得到一个实例,并做一些事情,结果/更改

3.) get an instance and do something with the result/change

 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"));
        }
    };
}

上prefSelected 方式这里是概念性的。你可以可以采取所得到的值,它坚持到JsonString。

The onPrefSelected method here is conceptual. You can could take the resulting value and persist it to a JsonString.

这篇关于自定义对话框preference的默认值为null的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆