我有一个片段A和一个片段B. 片段A从2个不同的屏幕(也是片段)调用。
现在,无论何时调用,片段A都会使用setArguments(bundle)将参数传递给片段B.
像这样:(这些行写在片段A中)
Bundle bundle = new Bundle();
bundle.putString("bookId", bookListItems.get(position).getBookId());
bundle.putString("bookName", bookListItems.get(position).getBookName());
Fragment b = new B();
b.setArguments(bundle);
replaceFragment(b, bundle);
和函数replaceFragment如下:
private void replaceFragment (Fragment fragment, Bundle bundle) {
String backStateName = fragment.getClass().getName();
FragmentManager manager = mActivity.getFragmentManager();
boolean fragmentPopped = manager.popBackStackImmediate (backStateName, 0);
if (!fragmentPopped) { //fragment not in back stack, create it.
FragmentTransaction ft = manager.beginTransaction();
ft.replace(R.id.frame_container, fragment);
ft.addToBackStack(backStateName);
ft.commit();
} else {
fragment.getArguments().putString("bookId", bundle.getString("bookId"));
fragment.getArguments().putString("bookName", bundle.getString("bookName"));
}
}
现在,问题是,当从屏幕1调用片段A时,它工作正常并将正确的参数传递给片段B.但是当从屏幕2调用它时,传递给B的参数永远不会更新,它总是打开片段B的最后一个状态。
请帮忙。
答案 0 :(得分:0)
Fragment
的子类中创建新数据,并在您想要更新时从托管活动中调用此方法
public void updateData(String bookName, String bookId) {
if (getView() == null) {
return;
}
((TextView)getView().findViewById(R.id.texviewid)).setText(bookName);
}
在Activity
中,您必须作为类成员保留对特定子类的引用。
另一种方法可以使用BroadcastReceiver
。在Fragment中使用特定的IntentFilter
注册它,并在您的Activity中使用LocalBroadcastManager
在本地广播更改的意图。您仍然可以使用相同的方法来更新UI。调用onReceive时,检查片段状态,如果它处于正确状态,则从Intent
中提取数据,然后调用该方法。 E.g。
@Override
public void onReceive(Context context, Intent intent) {
if (isRemoving() || isDetached() || !isAdded()) {
return;
}
// extract data from intent
// call updateData
}