2012-06-08 59 views
0

我想使用NumberPicker首选项。NumberPickerPreference - 未加载默认值

基本上代码正常工作。一个对话框以NumberPicker打开。该值可以被选择并保存到defaulSharedPreferences中。

但第一次PreferenceActivity启动时,默认值没有加载,我不知道为什么。

行为如下所示:当我打开PreferenceActivity时,NumberPickerPreference的摘要显示-1。当我关闭活动并重新打开它时,值保持-1(这是只要defaultSharedPreferences在存储的键下没有值)。只要用户选择了一个值(或者通过密钥将代码保存到defaultSharedPreferences中),everthing就可以工作,并且在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));  
     } 
    } 

回答

0

尝试persistInt(的newval)后加入notifyChanged()

+0

对不起,迟到的答案。这并没有改变行为... – KarlKarlsom

2

我遇到同样的问题。不知道它是否正确,但呼吁

setDefaultValue(Object);

与我在Preference构造函数中的默认值似乎解决了这个问题。