【发布时间】:2015-01-27 10:34:27
【问题描述】:
我为我的问题准备了一个非常简单的测试用例,其中包含 1 个活动和 2 个片段:
- MainActivity.java(将所选项目存储在共享首选项中)
- MyMainFragment.java(显示文本视图和“选择”按钮)
- MyListFragment.java(显示项目列表)
最初 MainActivity 显示 MyMainFragment。
当用户触摸“选择项目...”按钮时,MainActivity 显示 MyListFragment :
public void selectedButtonClicked() {
SharedPreferences prefs = getSharedPreferences(PREFS, 0);
int index = prefs.getInt(INDEX, -1);
Fragment fragment = MyListFragment.newInstance(index);
getFragmentManager().beginTransaction()
.addToBackStack(null)
.replace(R.id.root, fragment, LIST)
.commit();
}
用户触摸列表中的一项后,MainActivity 将所选项目位置存储在共享首选项中,并调用popBackStack() 再次显示 MyMainFragment:
public void itemSelected(int index) {
SharedPreferences prefs = getSharedPreferences(PREFS, 0);
Editor editor = prefs.edit();
editor.putInt(INDEX, index);
editor.commit();
getFragmentManager().popBackStack();
// How to show the index in mSelectedTextView?
}
即我的应用程序中的 MainActivity 完成了所有“繁重的工作”:它显示 2 个片段中的 1 个,并将用户数据保存在共享首选项中。
我的问题是:如何在 MyMainFragment 的mSelectedTextView 中显示选中的项目(上图中的“Item 07”)?
我正在寻找一种方法来正确地做到这一点,没有任何黑客(例如片段不应该触及共享偏好)。
更新:我已经尝试了 corsair992 的建议(谢谢!)
public void itemSelected(int index) {
SharedPreferences prefs = getSharedPreferences(PREFS, 0);
Editor editor = prefs.edit();
editor.putInt(INDEX, index);
editor.commit();
getFragmentManager().popBackStackImmediate();
MyMainFragment f = (MyMainFragment) getFragmentManager().findFragmentById(R.id.root);
// call a method in MyMainFragment to update mSelectedTextView
f.setText("Selected index: " + index);
}
但它仅在用户触摸 MyListFragment 中的项目时才有效。但是,当用户通过触摸返回按钮返回 MyMainFragment 时,它不起作用。
【问题讨论】:
-
查看Android Custom Event Listener的以下帖子,使用自定义事件片段将从另一个片段获取更新
-
@AlexanderFarber:就像你将它从 Fragment2 传递给 Activity 一样?将
popBackStack()替换为popBackStackImmediate()并使用findFragmentById()检索Fragment。 -
即使用户在没有选择任何项目的情况下按下返回按钮,您是否需要与主
Fragment通信?在这种情况下,您需要添加OnBackStackChangedListener来收听该事件。 -
@AlexanderFarber:您需要将所选项目保存为主 Fragment 状态的一部分,因为它在移入和移出后堆栈时会被销毁并重新创建。
-
@AlexanderFarber:使用
onSaveInstanceState()回调来保存您的状态。
标签: android android-fragments android-listfragment