【问题标题】:How to update internal values of a PreferenceActivity when SharedPreferences changeSharedPreferences 更改时如何更新 PreferenceActivity 的内部值
【发布时间】:2011-07-29 18:55:55
【问题描述】:

我在 PreferenceActivity 中使用 Preference 来加载默认值:当点击这个特定的 Preference 时,会发生这样的事情:

private String mResetKeys = "key1,key2,key3";

SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getContext());
SharedPreferences.Editor prefs_editor = prefs.edit();
for (String current_pref : mResetKeys.split(",")) {
    prefs_editor.remove(current_pref);
}
prefs_editor.commit();

但之后,相应 SharedPreference 被重置的 Preferences 仍然显示旧值 - 它似乎被缓存在 Preference 中。只有当我离开 PreferenceActivity 并重新打开它时,Preferences 才会显示新值。

如何以编程方式更新 PreferenceActivity?

【问题讨论】:

    标签: android preferences reset


    【解决方案1】:

    我遇到了类似的问题。这可能不是最正确的修复,但它适用于我的目的。完成提交后,我立即调用了Activity.recreate(); 方法。

    活动将重新开始 (onDestroy()/onCreate()/etc),但出于我的目的,我只需要对一个偏好进行特殊处理。我用OnPreferenceClickListener 听取了某种偏好,并制作了一个警告对话框,其中包含一种警告消息和一个改变主意的选项。如果他们确实想改变主意,我将新值提交到首选项活动,然后调用 recreate() 以便更新复选框首选项。

    但是,我也有兴趣在不重新创建活动的情况下执行此操作...

    【讨论】:

    • 对,SharedPreferences 被写入,但 PreferenceActivity 及其 PreferenceScreens 层次结构没有得到更新。我花了几个小时才弄明白是这样的……重新创建()!是的!谢谢!
    【解决方案2】:

    更新偏好值而不重新加载 PreferenceActivity 来自http://liquidlabs.ca/2011/08/25/update-preference-value-without-reloading-preferenceactivity/

    这里是如何更新目标元素的默认共享偏好值(在本例中为 EditTextPreference)

    public class YourCustomPreference extends PreferenceActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    
        // Load the preferences from an XML resource
        addPreferencesFromResource(R.xml.preferences);
    }
    
    // some logic goes above, when you want to reset value and update EditTextPreference value
    // For convenience, I am going to wrap two different task in different methods
    private void resetPreferenceValue() {
        SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(this.getApplicationContext());
        SharedPreferences.Editor prefEditor = sharedPref.edit(); // Get preference in editor mode
        prefEditor.putString("your_edit_text_pref_key", "DEFAULT-VALUE"); // set your default value here (could be empty as well)
        prefEditor.commit(); // finally save changes
    
        // Now we have updated shared preference value, but in activity it still hold the old value
        this.resetElementValue();
    } 
    
    private void resetElementValue() {
        // First get reference to edit-text view elements
        EditTextPreference myPrefText = (EditTextPreference) super.findPreference("your_edit_text_pref_key");
    
        // Now, manually update it's value to default/empty
        myPrefText.setText("DEFAULT-VALUE"); // Now, if you click on the item, you'll see the value you've just set here
    }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-17
      • 1970-01-01
      • 2012-04-28
      • 2015-09-12
      • 1970-01-01
      • 2013-12-17
      • 2011-12-21
      • 1970-01-01
      相关资源
      最近更新 更多