0

NumberPicker 設定を使用したいと思います。

基本的に、コードは期待どおりに機能しています。ダイアログが開き、NumberPicker が表示されます。値は選択可能であり、defaulSharedPreferences に保存されます。

しかし、PreferenceActivity が初めて開始されたときに、デフォルトの値がロードされず、その理由がわかりません。

動作は次のとおりです。PreferenceActivity を開くと、NumberPickerPreference の概要に -1 が表示されます。アクティビティを閉じて再度開くと、値は -1 のままです (これは、保存されているキーの下に defaultSharedPreferences の値がない限りです)。値がユーザーによって選択されるとすぐに (または値がキーの下のコードによって defaultSharedPreferences に保存されると)、すべてが機能し、PreferenceActivity が開始されると値が読み込まれます。

    public class NumberPickerPreference extends DialogPreference implements NumberPicker.OnValueChangeListener
    {
        private static final String NAMESPACE="http://schemas.android.com/apk/res/android";

        private NumberPicker mNumberPicker;
        private TextView mTvDialogMessage;
        private Context mCtx;

        private String mDialogMessage;
        private int mDefault;
        private int mMax;
        private int mValue = 0;

        public NumberPickerPreference(Context ctx, AttributeSet attr) { 
            super(ctx, attr); 
            mCtx = ctx;

            //Get XML attributes
            mDialogMessage = attr.getAttributeValue(NAMESPACE,"dialogMessage");
            mDefault = attr.getAttributeIntValue(NAMESPACE,"defaultValue", 2);
            mMax = attr.getAttributeIntValue(NAMESPACE,"max", 20);
        }

        @Override 
        protected View onCreateDialogView() {
            //Create Views
            LinearLayout dialogLayout = new LinearLayout(mCtx);
            mTvDialogMessage = new TextView(mCtx);
            mNumberPicker = new NumberPicker(mCtx);

            //Set View attributes
            dialogLayout.setOrientation(LinearLayout.VERTICAL);
            if (mDialogMessage!=null)
                mTvDialogMessage.setText(mDialogMessage);
            dialogLayout.addView(mTvDialogMessage);
            mNumberPicker.setOnValueChangedListener(this);
            dialogLayout.addView(mNumberPicker, new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT));
            if (shouldPersist())
                mValue = getPersistedInt(mDefault);
            mNumberPicker.setMaxValue(mMax);
            mNumberPicker.setMinValue(1);
            mNumberPicker.setValue(mValue);
            return dialogLayout;
        }

        @Override 
        protected void onBindDialogView(View v) {
            super.onBindDialogView(v);
            mNumberPicker.setMaxValue(mMax);
            mNumberPicker.setMinValue(1);
            mNumberPicker.setValue(mValue);     
            setSummary(mValue);
        }

        @Override
        protected void onSetInitialValue(boolean restore, Object defaultValue)  
        {
            super.onSetInitialValue(restore, defaultValue);
            if (restore) 
                mValue = shouldPersist() ? getPersistedInt(mDefault) : 2;
            else 
                mValue = (Integer)defaultValue;
            if (mNumberPicker!=null)
                mNumberPicker.setValue(mValue);
            setSummary(mValue);
        }

        public void setSummary(int value) {
            CharSequence summary = getSummary();
            value=getPersistedInt(-1);
            if (summary == null) {
                setSummary(Integer.toString(value));
            } else {
                setSummary(String.format(summary.toString(), value));
            }
        }

        public void onValueChange(NumberPicker picker, int oldVal, int newVal) {
            setSummary(newVal);
            if (shouldPersist())
                persistInt(newVal);
            callChangeListener(new Integer(newVal));    
        }
    }
4

2 に答える 2

2

同じ問題が発生していました。正しいかどうかはわかりませんが、呼び出しています

setDefaultValue(オブジェクト);

Preference コンストラクターのデフォルト値でこれを解決したようです。

于 2012-11-25T04:09:56.727 に答える
0

persistInt(newVal) の後に notifyChanged() を追加してみてください

于 2012-06-09T03:43:39.263 に答える