【问题标题】:How to set the values of PreferenceActivity(R.xml.preferences) dynamically loading it from SharedPreferences?如何设置 PreferenceActivity(R.xml.preferences) 的值从 SharedPreferences 动态加载?
【发布时间】:2012-04-10 11:58:37
【问题描述】:

我有一个像这样扩展 PreferenceActivity 的 MyPreferenceActivity:

public class MyPreferenceActivity extends PreferenceActivity{


  @Override
  public void onCreate(Bundle savedInstanceState) {     
    super.onCreate(savedInstanceState);        
    addPreferencesFromResource(R.xml.preferences);  
  }

}

我也有自定义的共享偏好,R.xml.preferences 与个人偏好类绑定...例如

preferences.xml 有

            <!--EditTextPreference-->
            <com.myapp.preferences.PrimaryNumberPreference
                android:key="PREFS_PRIMARY_NUMBER"
                android:title="@string/primary_number_preference_title" 
                android:summary="@string/primary_number_preference_summary"
                android:dialogTitle="@string/primary_number_preference_dialog_title" 
                    android:dialogMessage="@string/primary_number_preference_dialog_message"  
            />

PrimaryNumberPreference.java:

public class PrimaryNumberPreference extends EditTextPreference {

Context ctx = null;

public PrimaryNumberPreference(Context context) {
    super(context);
    this.ctx = context;
}

public PrimaryNumberPreference(Context context, AttributeSet attrs) {
    super(context, attrs);
    this.ctx = context;
}

public PrimaryNumberPreference(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
    this.ctx = context;

}

@Override
protected void onDialogClosed(boolean positiveResult) {
    super.onDialogClosed(positiveResult);
    if (positiveResult){    
        customPreferenceibrary.setPrefsPrimaryNumber(getText());
    }
}

}

好的,一切似乎都已到位。现在我想要的是每次加载 PreferenceActivity 时,它应该获取存储在各自键中的当前 sharedpreference 值并预填充 PreferenceActivity 的元素......

例如:安装我的应用时,PrimaryNumber 共享首选项设置为 1234。现在,如果我转到 MyPreferenceActivity 并浏览 PrimaryNumber EditTextPreference,文本框应预填充 1234。

类似的东西(伪代码):

MyPreferenceActivity.PrimaryNumberPreference.Val = getSharedPreferences(prefsPrimaryNumber)

我该怎么做?

编辑

如果问题不清楚并且需要更好的解释,请告诉我。我确信答案是在 android 中非常标准的东西的简单实现。所有 PreferenceActivity 元素仅从存储的 SharedPreferences 中选择要显示的当前值,对吗?

【问题讨论】:

    标签: android sharedpreferences preferenceactivity


    【解决方案1】:

    我认为我看到了两个潜在的问题:

    问题一

    如果您有自定义首选项,例如 PrimaryNumberPreference.java,则需要在对话框关闭时手动保存首选项。这就是您在 customPreferenceibrary.setPrefsPrimaryNumber(getText()); 中所做的吗?

    如果他们没有在这个函数中提交,那么我认为他们需要这样做。 (或在 onDialogClosed 的其他地方提交)

    问题二

    假设您在 setPrefsPrimaryNumber 中提交首选项,我认为 setPrefsPrimaryNumber 需要接收两个参数,

    1. 首选项名称
    2. 实际值

    我认为仅在 XML 中设置键名是不够的(android:key="PREFS_PRIMARY_NUMBER 是不够的)

    希望这会有所帮助。

    【讨论】:

    • 是的,我通过覆盖所有首选项的 onDialogClosed() 来保存首选项。有没有更好的选择。我选择这种方式是因为我想将代码模块化作为一个庞大的项目,其中包含使用自定义共享首选项的大量库类。感谢您的帮助!
    • 我不知道设计的优缺点,但只要您提交偏好,它应该可以工作。我认为您的问题一定是第二个问题(我的回答中的问题二)。如果 setPrefsPrimaryNumber 只有一个参数,它如何知道要提交的首选项?
    • 这根本不是问题。每个 SetPrefs 对应一个特定的 sharedpreference...setPrefsPrimaryNumber 更新 Primary_Number_Preference。 setPrefsSecondaryNumber 等也是如此。这些都是偏好库类中的公共方法!好吧,主要问题是如何在 PreferenceActivity 中显示当前的共享偏好值......例如:让我们说 prim numbr 是 1234 支持共享偏好。现在,当我打开 PreferenceActivity 并单击 Primary Number 时,EditText 应该预先填充“1234”。怎么做?明白了吗?
    • 假设已保存首选项试试这个...在您的 PrimaryNumberPreference 构造函数中添加“keyName = this.getKey()”然后在您的首选项活动中添加“pref = (PrimaryNumberPreference) getPreferenceManager()。 findPreference("PREFS_PRIMARY_NUMBER"); pref.setText("1234");"
    • (上面注释中的“1234”用作从SharedPreferences获得的值的占位符)
    【解决方案2】:

    我在@Mel 提供的建议的帮助下找到了答案,而且非常简单。

    在扩展相应 PreferenceActivity 元素的类中(例如,如下所示),只需在该偏好元素类的构造函数中添加 this.setValue 即可。就是这样!

    public class selectColorPreference extends ListPreference{
    
        Context ctx = null;
        private String error = null;
        private int prefsRemoteSMSAccess;
        MyPreferencesLibrary myPreferencesLibrary;
    
        public selectColorPreference(Context context) {
            super(context);
            this.ctx = context;
    
            myPreferencesLibrary = new MyPreferencesLibrary(ctx);
            this.setValue(myPreferencesLibrary.getSharedPreferenceValueForColor());
    
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-23
      • 1970-01-01
      • 2011-12-04
      • 1970-01-01
      • 2021-07-21
      • 2015-10-10
      • 2022-12-04
      • 2011-03-20
      相关资源
      最近更新 更多