Android的片段 – 从一个视图移动到另一个?

我可以先添加一个片段到一个视图,然后“分离”它,然后“重新附加”到另一个视图?

在代码中,我想:

fragOne one = new fragOne(); getSupportFragmentManager().beginTransaction() .add(R.id.left, one, "tag").commit(); getSupportFragmentManager().beginTransaction() .detach(one).commit(); // or .remove(), or .addToBackStack(null).remove() getSupportFragmentManager().executePendingTransactions(); getSupportFragmentManager().beginTransaction() .add(R.id.right, one).commit(); 

但它会抛出错误:

 04-05 13:28:03.492: E/AndroidRuntime(7195): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.trybackstack/com.example.trybackstack.MainActivity}: java.lang.IllegalStateException: Can't change container ID of fragment fragOne{40523130 #0 id=0x7f080000 tag}: was 2131230720 now 2131230721 

感谢帮助!

Solutions Collecting From Web of "Android的片段 – 从一个视图移动到另一个?"

我有同样的问题,但我发现我真正需要的是重新将片段的视图,而不是片段本身,从而避免任何fragmentManager交易。

 View vv = fragment.getView(); ViewGroup parent = (ViewGroup)vv.getParent(); parent.removeView(vv); newparent.addView(vv, layoutParams); 

在尝试所有类似问题的答案后,看起来像我已经find了一个办法来做这个伎俩。

第一个问题 – 在尝试将碎片添加到另一个容器之前,您实际上必须提交执行删除事务。 谢谢你的回答

但是这不是每次都有效。 第二个问题是后退堆栈。 它以某种方式阻止交易。

所以完整的代码,对我来说很像:

 manager.popBackStackImmediate(null, manager.POP_BACK_STACK_INCLUSIVE); manager.beginTransaction().remove(detailFragment).commit(); manager.executePendingTransactions(); manager.beginTransaction() .replace(R.id.content, masterFragment, masterTag) .add(R.id.detail, detailFragment, activeTag) .commit(); 

我猜你现在可能已经知道了,但是我没有看到任何满意的答案。 所以,我将这个post发布给其他将来可能会参考的人。

如果您想将片段从一个视图移到另一个视图,请执行以下操作:

 android.app.FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); fragmentTransaction.remove(fragment1); fragmentTransaction.commit(); fragmentManager.executePendingTransactions(); fragmentTransaction = fragmentManager.beginTransaction(); fragmentTransaction.add(R.id.containerToMoveTo, fragment1); fragmentTransaction.commit(); 

这样你就不必复制片段。

请检查解决scheme,如果要保存旧片段的状态,则需要创build同一片段的新实例,并将其与旧片段的状态实例化。

  FragmentTransaction ft = mFragmentManager.beginTransaction(); ft.remove(one); Fragment newInstance = fetchOldState(one); ft.add(R.id.right, newInstance); ft.commit(); //TO fetch the old state private Fragment fetchOldState(Fragment f) { try { Fragment.SavedState oldState= mFragmentManager.saveFragmentInstanceState(f); Fragment newInstance = f.getClass().newInstance(); newInstance.setInitialSavedState(oldState); return newInstance; } catch (Exception e) // InstantiationException, IllegalAccessException { } } 

我也遇到了这个问题。 有时移动的片段有效,有时你必须创build一个新的实例。 如果片段一直处于“isRemoving”状态,似乎移动片段不起作用。 被删除似乎也被阻止在后台有一个片段。

joinYan。 尤尔金的回答 确保没有任何转换应用到事务中,因为这些操作似乎会延迟碎片的分离。