片段的几个实例正在重用相同的Bundle

时间:2014-07-29 22:27:44

标签: android android-fragments bundle fragmenttransaction

今天我一直面临一个非常奇怪的情况。

创建片段的多个实例时,让我们说MyFragment,然后我使用FragmentTransaction替换它们来提交更改,所有这些都重复使用Bundle第一个创建的实例。

我使用公共静态方法作为“工厂”来创建MyFragment的每个实例:

public class MyFragment extends Fragment {

    public static final String FRAG_TAG = "MyFragment";

    public static MyFragment newInstance(int myIntArgValue) {
          final MyFragment frag = new MyFragment();
          final Bundle bundle = new Bundle();
          bundle.putInt("myIntArg", myIntArgValue);
          frag.setArguments(bundle);
          return frag;
    }

   /** Other relevant methods of the fragment. */
}

然后我将所有实例一个接一个地添加到堆栈中:

final FragmentTransaction ft = getActivity().getSupportFragmentManager().beginTransaction();
final MyFragment frag = MyFragment.newInstance(position); // position is always a different value
ft.replace(android.R.id.content, frag, MyFragment.FRAG_TAG).addToBackStack("BACK_STACK_TAG"); // I already tried ft.add(...) or ft.remove(this).replace(...);
ft.commit();

因此,对于此片段的2个实例,例如MyFragment.newInstance(1);MyFragment.newInstance(2); getArguments().getInt("myIntArg")始终返回1(第一个创建的实例的值)。

为了解决这个问题,我做了类似的事情:

final FragmentTransaction ft = getActivity().getSupportFragmentManager().beginTransaction();
final MyFragment frag = MyFragment.newInstance(position);
final Bundle args = frag.getArguments();
args.remove("myIntArg");
args.putInt("myIntArg", position /** The value I really want to and should be used by the "factory" */);
frag.setArguments(args); // I can to this because the fragment is not yet attached
ft.replace(android.R.id.content, frag, MyFragment.FRAG_TAG).addToBackStack("BACK_STACK_TAG");
ft.commit();

我知道不应该这样做,但它有效。 有没有人面对这样的事情?我在这里做错了什么?

1 个答案:

答案 0 :(得分:0)

我认为问题在于:

 frag.setArguments(frag);

你不应该为bundle设置参数吗?