从(子)PreferenceScreen 返回时更新 PreferenceActivity 中的现有首选项
我有一个 PreferenceActivity 和一堆(子)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);
}
当用户输入子 PreferenceScreen 并编辑帐户用户名时,我希望外部 PreferenceScreen 更新相关帐户的 PreferenceScreen 标题。
我尝试添加...
usernamePref.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
public boolean onPreferenceChange(Preference preference, Object newValue) {
accScreen.setTitle(newValue.toString());
return true;
}
});
...但 accScreen.setTitle 似乎没有在外部 PreferenceScreen 上生效。我注意到调用 onContentChanged();
实际上可以使其工作,但我意识到这可能不是首选的方法。
我怀疑我应该在某个视图上调用 postInvalidate()
,但我真的不知道在什么视图上以及何时执行此操作。
PreferenceScreen android:summary update! 可能遇到了和我一样的问题。
任何帮助表示赞赏。
I have a PreferenceActivity with a bunch of (Sub)PreferenceScreens. Each such (Sub)PreferenceScreen represents an account and has the account-username as its title.
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);
}
As the user enters sub-PreferenceScreen, and edits the account user-name, I want the outer PreferenceScreen to update it's PreferenceScreen-title for the account in question.
I've tried to add...
usernamePref.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
public boolean onPreferenceChange(Preference preference, Object newValue) {
accScreen.setTitle(newValue.toString());
return true;
}
});
...but the accScreen.setTitle does not seem to take effect on the outer PreferenceScreen. I've note that calling onContentChanged();
actually makes it work, but I realize that this is probably not the preferred way of doing it.
I suspect I should call postInvalidate()
on some view somewhere, but I really can't figure out on what view and when to do it.
PreferenceScreen android:summary update ! may be experiening the same problem as me.
Any help appreciated.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(8)
我找到了解决这个问题的方法。我有一个像这样的层次结构,每个都是一个 PreferenceScreen:
在用户列表中,子屏幕的标题取决于用户设置。现在,当我创建用户列表时,我将列表适配器存储到 PreferenceActivity 中的变量中。
现在,当编辑 userX-settings 时,我在 usersListScreen 中设置标题,然后调用:
更新列表 UI 并且更改可见。
I found a solution to this. I have a hierarchy like this, each of these is a PreferenceScreen:
In the users list, title of the sub-screen is dependent on the user settings. Now when I create the user list, I store the list adapter to a variable in my PreferenceActivity.
Now when userX-settings are edited, I set the titles in the usersListScreen and after that call:
which updates the list UI and the changes are visible.
notifyDataSetChanged() 是正确的解决方案。但我想为所有 PreferenceScreen 添加递归迭代器,因为我在查找 Preference 的真正父级时遇到问题。对于复杂的首选项结构,我推荐这个杀手级代码:
我在每个 setSummary() 之后调用它,以确保它正常工作:
notifyDataSetChanged() is right solution. But I want to add recursive iterator for all PreferenceScreens, as far as I got a problem to find real parent of a Preference. For complicated structure of Preferences I recommend this killer-code:
I call it after every setSummary() to ensure it works properly:
这可能是一个迟到的答案,但仍然......我现在就在上面:)
我实现它的方式是,你可以连接到PreferenceFragmentCompat的onResume()< /strong> 其生命周期的方法,并通过重置其值来手动更新必填字段。
注意:在这个例子中,我还跟踪编辑的首选项的索引,只是为了避免重置每个选项。
如文档中所指定:
好处是它当然也可以与 FragmentManager 的 Transactions 一起使用。
希望这有帮助,编码愉快! :)
this might be a late answer but still... I'm on it right now :)
The way I achieved it, is that you can hook into the PreferenceFragmentCompat's onResume() method of its lifecycle and manually update the required field by resetting their values.
Note : in this example I also keep track of the index of the edited Preference, just to avoid reset every single ones.
As specified in the docs :
Which is good is that it also works of course with FragmentManager's Transactions.
Hope this helps, happy coding ! :)
遇到同样的问题,但 onContentChanged() 对我不起作用。我的问题是 PreferenceScreens 距离根的深度超过一级。
按照您的示例,如果您首先创建了一个“帐户”PreferenceScreen,然后在其下添加了每个个人帐户 PreferenceScreen 对象。像这样:
如果用户编辑了他们的用户名并单击“保存”,则调用 PreferenceActivity.onContentChanged() 似乎只会影响根 PreferenceScreen 的直接后代。第三代屏幕的标题和摘要没有重新绘制,仍然反映旧的价值观。
查看 onContentChanged() 的代码,看起来它只是将根 Screen 重新绑定到 ListActivity 的 ListView,尽管我不认为后续的 PreferenceScreen 会绑定到 ListView(是吗?),所以我们无法手动重新绑定任何内容...
我能想到的唯一解决方法是将子菜单创建为独立的 PreferenceActivitys 而不是 PreferenceScreens,因此我们可以有意在我们的直接祖先上调用 onContentChanged() 。但这比当前的解决方法更像是一种拼凑。有什么想法吗?
Experiencing this same problem, but onContentChanged() isn't working for me. My problem is with PreferenceScreens that are more than one level deep from the root.
To follow your example, if you first created an "Accounts" PreferenceScreen, and then added each of your individual account PreferenceScreen objects under that. Like this:
If a user edited their username and clicked save, calling PreferenceActivity.onContentChanged() seems to only affect direct descendants of the root PreferenceScreen. The third-generation screens' titles and summaries do not get redrawn, still reflecting old values.
Looking through the code for onContentChanged(), it looks like it just re-bind()s the root Screen to the ListActivity's ListView, although I don't think subsequent PreferenceScreens are ever bound to a ListView (are they?), so we can't manually re-bind anything...
The only workaround I can think of would be to create the sub-menus as isolated PreferenceActivitys instead of PreferenceScreens, so we can intentionally call onContentChanged() on our direct ancestor. But that's even more of a kludge than the current workaround. Any ideas?
PreferenceActivity#onContentChanged()
将刷新整个屏幕,出现一些闪烁效果。不过,您可以使用
PreferenceActivity#onPreferenceTreeClick(...)
方法在给定的首选项上有选择地实现相同的目标。请注意,此方法现已弃用:考虑使用 fragments 似乎可以解决问题自定义首选项有很多问题(我还没有测试过自己)。对于旧版 SDK,有兼容性包。
PreferenceActivity#onContentChanged()
will refresh the whole screen, occurring some flicker effect.However you can achieve the same goal selectively on a given preference with the
PreferenceActivity#onPreferenceTreeClick(...)
method.Note that this method is now deprecated : consider using fragments that seems to solve a lot of issues with custom preferences (I've not tested myself yet). There is a compatibility package for older SDK.
放置。
我只是在更新我的父偏好项目的摘要后立即
I'm just putting
right after updating the summary of my parent preference item.
来源
Source
这对我有用,你必须抓住 PreferenceScreen 的底层对话框并从那里设置标题,非常简单。
This works for me, you have to grab the underlying dialog of your PreferenceScreen and set the title from there, really easy.