如何刷新PreferenceActivity以显示设置中的更改?

Ema*_*een 28 settings android refresh preferenceactivity

根据以下代码,您能告诉我如何刷新PreferenceActivity窗口以立即显示设置中的更改吗?例如:用户点击主chime切换复选框为true(勾选),我希望用户立即看到其他设置,如ChimeOn15Past复选框也是true(勾选)

SharedPreferences.Editor prefEditor = clockSettings.edit(); // Allow the settings to be changed.

if (booleanMasterChimeToggle == true) {
    prefEditor.putBoolean("ChimeOnTheHour", true);
    prefEditor.putBoolean("ChimeOn15Past", true);
    prefEditor.putBoolean("ChimeOn30Past", true);
    prefEditor.putBoolean("ChimeOn45Past", true);

    strNotifyMessage = "Full chiming has now been set.";

} else {
    prefEditor.putBoolean("ChimeOnTheHour", false);
    prefEditor.putBoolean("ChimeOn15Past", false);
    prefEditor.putBoolean("ChimeOn30Past", false);
    prefEditor.putBoolean("ChimeOn45Past", false);

    strNotifyMessage = "Full chiming has now been disabled.";
}
Run Code Online (Sandbox Code Playgroud)

Sol*_*n14 40

代替

finish();
startActivity(getIntent());
Run Code Online (Sandbox Code Playgroud)

我更喜欢以下代码:

setPreferenceScreen(null);
addPreferencesFromResource(R.xml.preferences);
Run Code Online (Sandbox Code Playgroud)

这也将重置显示器,但没有整个完成程序及其后果.此外,此代码适用于PreferenceActivityPreferenceFragment.

如果您想动态更改区域设置值,这很有趣.在这种情况下,与经理合作是不够的,因为您需要完全重新加载标题和值.

编辑:setPreferenceScreen已弃用PreferenceActivity(仍在工作)但不在PreferenceFragment

  • @Mr_and_Mrs_D,是的; 屏幕重置,因此如果您在中途滚动,则会在您更改首选项时将其滚动回顶部. (2认同)

Joe*_*Joe 30

尼古拉的回答是正确的.我只是想在这里添加一些代码来更清楚地说明他的观点.

private CheckBoxPreference mOn15Past;
private CheckBoxPreference mOn30Past;
private CheckBoxPreference mOn45Past;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // Load the preferences from an XML resource
    addPreferencesFromResource(R.xml.preferences);

    mOn15Past = (CheckBoxPreference) findPreference("ChimeOn15Past");
    mOn30Past = (CheckBoxPreference) findPreference("ChimeOn30Past");
    mOn45Past = (CheckBoxPreference) findPreference("ChimeOn45Past");

    final Preference chimeMaster = findPreference("ChimeMaster");
    chimeMaster.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
        @Override
        public boolean onPreferenceChange(Preference preference, Object newVal) {
            final boolean value = (Boolean) newVal;
            mOn15Past.setChecked(value);
            mOn30Past.setChecked(value);
            mOn45Past.setChecked(value);
            return true;
        }

    });
}
Run Code Online (Sandbox Code Playgroud)

简而言之,PreferenceActivity它不是设计为在启动后从持久存储中刷新其值.您不必SharedPreferences.Editor像在代码中那样修改和提交其他更改,而是将更改更改为PreferenceManagerPreferenceActivity在其正常生命周期中提交的本地对象.

  • 这是做到这一点的“正确”方式。让 PreferenceScreen 管理它自己的刷新,而不是与 SharedPreferences 争斗并手动刷新 UI。 (2认同)

Mar*_*ski 13

有一种简单的方法可以立即刷新列表中的所有项目.只需执行以下操作:

getPreferenceScreen().removeAll();
addPreferencesFromResource(R.xml.preferences);
Run Code Online (Sandbox Code Playgroud)

使用这种方法,您不会失去ListView的位置.

  • 确保正确设置了依赖项的任何设置(父级优先),否则会导致"IllegalStateException" (2认同)
  • 这将删除您偏好的听众(或任何附加的内容)。 (2认同)