今天我一直面临一个非常奇怪的情况。
创建片段的多个实例时,让我们说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();
我知道不应该这样做,但它有效。 有没有人面对这样的事情?我在这里做错了什么?
答案 0 :(得分:0)
我认为问题在于:
frag.setArguments(frag);
你不应该为bundle设置参数吗?