Android 已创建片段的更新参数

Android 已创建片段的更新参数,android,android-fragments,android-studio,Android,Android Fragments,Android Studio,我有一个片段a和一个片段B。 片段A是从两个不同的屏幕(也是片段)调用的 现在,无论何时调用,片段A都使用setArguments(bundle)将参数传递给片段B 这样:(这些行写在片段A中) 函数replaceFragment如下所示: private void replaceFragment (Fragment fragment, Bundle bundle) { String backStateName = fragment.getClass().getName(); Frag

我有一个片段a和一个片段B。 片段A是从两个不同的屏幕(也是片段)调用的

现在,无论何时调用,片段A都使用setArguments(bundle)将参数传递给片段B

这样:(这些行写在片段A中)

函数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的最后一个状态


请提供帮助。

您可以在
片段
的子类中创建新数据,并在需要更新时从宿主活动调用此方法

public void updateData(String bookName, String bookId) {
   if (getView() == null) {
      return;
   }
   ((TextView)getView().findViewById(R.id.texviewid)).setText(bookName);

}
活动中
必须作为类成员保留对特定子类的引用

另一种方法可以利用
广播接收器
。在片段中,将其注册到特定的
IntentFilter
,并从活动中使用
LocalBroadcastManager
在本地广播更改后的意图。您仍然可以使用相同的方法来更新UI。调用onReceive时,检查片段状态,如果它处于正确状态,则从
意图中提取数据,并调用该方法。例如

@Override
public void onReceive(Context context, Intent intent) {
     if (isRemoving() || isDetached() || !isAdded()) {
          return;
      }
      // extract data from intent
      // call updateData
}
@Override
public void onReceive(Context context, Intent intent) {
     if (isRemoving() || isDetached() || !isAdded()) {
          return;
      }
      // extract data from intent
      // call updateData
}