使用新参数重新启动片段

时间:2017-02-08 14:43:01

标签: java android android-fragments

我有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

3 个答案:

答案 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)

来自official documentaion

  

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;
}