引起:java.lang.IllegalArgumentException多个片段

时间:2015-03-13 10:46:27

标签: android fragment illegalargumentexception

我在这个问题上花了很多时间,我不知道问题在哪里。

我有片段A的活动。

片段A有第二个片段B,B有片段C。

活动:布局 - >使用 R.id.container (放置下一个片段的位置)

A:布局 - >使用 R.id.place_promo

B:布局 - >使用 R.id.container_promo

C:布局具有线性布局 R.id.promo_container

我有这个错误:

Caused by: java.lang.IllegalArgumentException: No view found for id 0x7f060109 (pl.xx.xx.xx:id/container_promo) for fragment FragmentxxxxOne{4252e858 #3 id=0x7f060109}

我以同样的方式放置所有片段:

getActivity()
        .getSupportFragmentManager()
        .beginTransaction()
        .replace(container, fragment)
        .commit();

任何sugestions?

我不知道何时出现此错误,因为它来自我的错误处理程序。

2 个答案:

答案 0 :(得分:1)

  

public abstract FragmentTransaction replace(int containerViewId,Fragment fragment)

     

使用空标记调用 replace(int,Fragment,String)

从这里......

  

public abstract FragmentTransaction replace(int containerViewId,Fragment fragment,String tag)

     

替换添加到容器的现有片段。这与使用相同的containerViewId添加的所有当前添加的片段调用remove(Fragment),然后使用此处给出的相同参数添加(int,Fragment,String)基本相同。

     

参数

     
      
  • containerViewId 要替换其片段的容器的标识符。
  •   
  • 片段 要放入容器中的新片段。
  •   
  • 标记 片段的可选标记名称,以便稍后使用FragmentManager.findFragmentByTag(String)检索片段。
  •   

所以你要替换 容器 给定的 片段 实例。

您还说每个片段都以这种方式管理。

您的应用如何运作的想法是:

  1. 获取 片段 的ID。我们称之为" fragID"
  2. 根据 容器
  3. 转到容器视图
  4. 根据" fragId"
  5. 查找要替换的片段
  6. 删除找到的片段
  7. 添加新的 片段 项目
  8. 问题在于,您只需保留REPLACING片段,您总是希望已经放置了一个片段。在第一次运行时根本没有片段, replace 方法无法找到(第3点)给定的片段。

    你应该首先考虑另一种add片段的方法,只有你需要它时才应该替换它们,事先检查它们的存在(提示:使用FragmentManager' s {{3}方法)

    更新

    可能错过了一件可能让事情变得混乱的事情。我不认为使用activity.getSupportFragmentManager()可能是嵌套片段的正确方法。将第一个片段添加到活动中是正确的方法。一旦你需要在第一个中嵌套第二个,你需要调用第一个片段' s FragmentManager

    否则,您只能将片段附加到活动

答案 1 :(得分:1)

这样可以正常工作,在onCreateView()方法中使用它

View rootView;


if (rootView != null) {
            ViewGroup parent = (ViewGroup) rootView.getParent();
            if (parent != null)
                parent.removeView(rootView);
        }
        try {
            rootView = inflater.inflate(R.layout.myride, container, false);
        } catch (InflateException e) {

        }