我有onCreateView()
我写的FragmentProductDetail:
if (getArguments() != null) {
idToRead = getArguments().getInt("productId");
setHasOptionsMenu(true);
} else {
idToRead = -1;
}
然后如何重新启动这个片段并提出新的参数?我试着写下这个:
Bundle arg = new Bundle();
arg.putInt("productId", idToRead);
Fragment fragCurrent = context.getSupportFragmentManager().findFragmentById(R.id.fragment_container);
FragmentTransaction fragTransaction = context.getSupportFragmentManager().beginTransaction();
fragTransaction.detach(fragCurrent);
fragTransaction.attach(fragCurrent);
fragCurrent.setArguments(arg);
fragTransaction.commit();
但他们两个都给我错误java.lang.IllegalStateException: Fragment already active
答案 0 :(得分:0)
您可以使用fragmentManager.replace()
函数替换片段。试试这个:
Bundle arg = new Bundle();
arg.putInt("productId", idToRead);
Fragment fragCurrent = context.getSupportFragmentManager().findFragmentById(R.id.fragment_container);
fragCurrent.setArguments(arg);
FragmentTransaction fragTransaction = context.getSupportFragmentManager().beginTransaction();
fragTransaction.replace(R.id.fragment_container, fragCurrent, fragCurrent.getTag());
fragTransaction.commit();
祝你好运。
答案 1 :(得分:0)
setArguments
在API级别11中添加void setArguments(Bundle args)提供 这个片段的构造参数。 这只能称为 在片段附加到其活动之前;那是你 应该在构造片段后立即调用它。该 这里提供的参数将保留在片段destroy和 创建
将片段附加到其活动后,您无法调用Fragment.setArguments()
。
做这样的事情:
Bundle arg = new Bundle();
arg.putInt("productId", idToRead);
Fragment fragCurrent = context.getSupportFragmentManager().findFragmentById(R.id.fragment_container);
FragmentTransaction fragTransaction = context.getSupportFragmentManager().beginTransaction();
fragTransaction.detach(fragCurrent);
FragmentProductList fragment = new FragmentProductList();
fragment.setArguments(arg);
fragTransaction.attach(fragment);
fragTransaction.commit();
请注意:在这里,您要创建片段的新实例,然后附加它。一旦设置了片段,就无法更改同一片段实例的参数。
或者,如果您想将新值添加到同一个片段,则可以使用getArguments()
。像这样:
Fragment fragCurrent = context.getSupportFragmentManager().findFragmentById(R.id.fragment_container);
Bundle arg = fragCurrent.getArguments();
arg.putInt("productId", idToRead);
FragmentTransaction fragTransaction = context.getSupportFragmentManager().beginTransaction();
fragTransaction.detach(fragCurrent);
fragTransaction.attach(fragCurrent);
fragTransaction.commit();
答案 2 :(得分:0)
我有自己的解决方案适合我。
在MainActivity.java中,我为想要保存一些全局变量的所有片段创建了地图
public static Map<Object, Object> dataSaver = new HashMap<>();
然后,当我想用新数据重新加载我的片段时,我写得像这样
Fragment fragCurrent = context.getSupportFragmentManager().findFragmentById(R.id.fragment_container);
FragmentTransaction fragTransaction = context.getSupportFragmentManager().beginTransaction();
fragTransaction.detach(fragCurrent);
MainActivity.dataSaver.put("productId", idToRead);
fragTransaction.attach(fragCurrent);
fragTransaction.commit();
然后在onCreateView()
里面我把这个
if (MainActivity.dataSaver.get("productId") != null) {
idToRead = getArguments().getInt("productId");
setHasOptionsMenu(true);
MainActivity.dataSaver.remove("productId");
} else {
idToRead = -1;
}