首页 > 开发 > Android > 正文

Android中Fragment的嵌套问题

2017-09-08 15:24:04  来源:网友分享

我想知道这是否是Android API中的一个bug:

我进行了如下设置:
1代表一个在右侧负载2号fragment(一个搜索屏)的menu;
2代表一个包含3号fragment(一个result list)搜索屏;
3代表一个用于不同环境中的结果列表(result list),
在1,2和3号fragment作为ActivityFragment时,它们在手机上都可以正常运行。
但当我使用如下代码:

FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();           Fragment frag = new FragmentNumber2();    if(toLoad != null) frag.setArguments(toLoad);    transaction.replace(R.id.rightPane, frag);          transaction.commit();

其中R.id.leftPane和R.id.rightPane是linear layout在水平方向上的
我之前认为,上述代码是删除了原有的fragment,添加了一个新的fragment。很明显,我的理解不完全正确,因为当代码第二次执行命令的时候,你会看到:

07-27 15:22:55.940: ERROR/AndroidRuntime(8105): Caused by: java.lang.IllegalArgumentException: Binary XML file line #57: Duplicate id 0x7f080024, tag null, or parent id 0x0 with another fragment for FragmentNumber3

造成这种结果主要是由于FragmentNumber3被复制,不再具备唯一的ID。而在此之前,1号fragment并未被破坏,请问这是Android中的bug吗?

原问题:Fragments within Fragments

解决方案

答:hackbod
(最佳答案)
这种异常是嵌套片段(nested fragment)与系统版本不相容导致的,而嵌套片段通常支持Android4.2。一个fragment的UI中嵌套另一个fragment,极有可能会造成程序运作异常。
注:嵌套片段只能在动态添加的操作中完成,也就是说,当layout中已经包含了一个,就不能将再将这个layout嵌入到fragment中。


答:furykid
你可以用destroyview的方法清理parent fragment中的嵌套片段:

@Override    public void onDestroyView() {      try{        FragmentTransaction transaction = getSupportFragmentManager()                .beginTransaction();        transaction.remove(nestedFragment);        transaction.commit();      }catch(Exception e){      }        super.onDestroyView();    }

答:Reneez
你可以用ViewPager来添加进更多的fragment。目前, Android Support Library可以支持嵌套片段,所以你可以在Android 1.6及以上版本进行嵌套操作。只要调用Fragment中的getChildFragmentManager()命令,就可以完成添加操作。例如,下述代码就可以完成在现有的Fragment class中添加fragment的操作:

Fragment videoFragment = new VideoPlayerFragment();FragmentTransaction transaction = getChildFragmentManager().beginTransaction();transaction.add(R.id.video_fragment, videoFragment).commit();

答:draksia
我在开发应用的过程中,也遇到过类似的问题,所以我用Linearlayout替换了xml文件中所有的fragment,然后在测试的环境下,用Fragment manager/ fragment transaction,对所有fragment逐一排查,最后程序可以正常运作。