从(子)PreferenceScreen返回时更新PreferenceActivity中的现有Preference项

aio*_*obe 9 android preferences invalidation preferenceactivity

我有一堆(Sub)PreferenceScreens的PreferenceActivity.每个这样的(Sub)PreferenceScreen代表一个帐户并且具有帐户 - 用户名作为其标题.

PreferenceScreen root = mgr.createPreferenceScreen(this);
for (MyAccountClass account : myAccounts) {
    final PreferenceScreen accScreen = mgr.createPreferenceScreen(this);

    accScreen.setTitle(account.getUsername());

    // add Preferences to the accScreen
    // (for instance a "change username"-preference)
    ...

    root.add(accScreen);
}
Run Code Online (Sandbox Code Playgroud)

当用户输入子PreferenceScreen并编辑帐户用户名时,我希望外部PreferenceScreen更新它的相关帐户的PreferenceScreen标题.

我试图添加......

usernamePref.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
    public boolean onPreferenceChange(Preference preference, Object newValue) {
        accScreen.setTitle(newValue.toString());
        return true;
    }
});
Run Code Online (Sandbox Code Playgroud)

...但是accScreen.setTitle似乎对外部PreferenceScreen没有生效.我注意到调用onContentChanged();实际上使它工作,但我意识到这可能不是这样做的首选方式.

我怀疑我应该postInvalidate()在某个地方调用一些视图,但我真的无法弄清楚什么视图以及何时进行操作.

PreferenceScreen android:摘要更新!可能正在经历与我相同的问题.

任何帮助赞赏.

Asm*_*nio 16

我找到了解决方案.我有这样的层次结构,每个都是一个PreferenceScreen:

main settings
  -> users list
    -> user1 settings
    -> user2 settings
    ...
Run Code Online (Sandbox Code Playgroud)

在用户列表中,子屏幕的标题取决于用户设置.现在,当我创建用户列表时,我将列表适配器存储到PreferenceActivity中的变量中.

 PreferenceScreen usersListScreen = ...
 userScreenListAdapter = (BaseAdapter)usersListScreen.getRootAdapter();
Run Code Online (Sandbox Code Playgroud)

现在,当编辑userX-settings时,我在usersListScreen中设置标题,然后在该调用之后:

userScreenListAdapter.notifyDataSetChanged();
Run Code Online (Sandbox Code Playgroud)

它会更新列表UI,并且可以看到更改.