android Fragment java.lang.IllegalStateException:The specified child already has a parent.

在做项目的时候 ,做到了一个Activity里面有两个Tab切换,每一个Tab是一个Fragment展示内容,当两个Tab来回切换的时候,报了一个错误

经过查找原因,原来是Fragment中OnCreateView()的方法调用错了:

正确的方法应该是:

查阅多方资料得知,我们都LayoutInflater的使用存在误区

我们最常用的便是 LayoutInflater的inflate方法,这个方法重载了四种调用方式,分别为:

1. public View inflate(int resource, ViewGroup root)

2.  public View inflate(int resource, ViewGroup root, boolean attachToRoot)

3.public View inflate(XmlPullParser parser, ViewGroup root)

4.public View inflate(XmlPullParser parser, ViewGroup root, boolean attachToRoot)

这四种使用方式中,我们最常用的是第一种方式,
inflate方法的主要作用就是将xml转换成一个View对象,用于动态的创建布局。虽然重载了四个方法,但是这四种方法最终调用的,还是第四种方式。第四种方式也很好理解,内部实现原理就是利用Pull解析器,对Xml文件进行解析,然后返回View对象。

inflate方法有三个参数,分别是

1. resource 布局的资源id

2. root 填充的根视图

3.attachToRoot是否将载入的视图绑定到根视图中

一般情况下,我们将BaseAdapter中的getView()方法:中根视图设置为null,

public View getView(int position, View convertView, ViewGroup parent) {
    if (convertView == null) {
        convertView = inflate(R.layout.item_row, null);
    }
    return convertView;
}

和我们将根视图设置为false

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

      if (convertView == null) {
        convertView = inflater.inflate(R.layout.item_list, parent,false);
      }
      return convertView;
    }

的区别是,如果在listview中的Item中根布局设置高度为40dp的话,第一种就没有效果。

经过看源码分析,当我们传进来的root参数不是空的时候,并且attachToRoot是false的时候,会重新给设置参数。

若我们采用 convertView = inflater.inflate(R.layout.item_list, null);方式填充视图,item布局中的根视图的layout_XX属性会被忽略掉,然后设置成默认的包裹内容方式。

除了使用这种方式,我们还可以设置item布局的根视图为包裹内容,然后设置内部控件的高度等属性,这样就不会修改显示方式了。

时间: 2024-10-22 06:11:19

android Fragment java.lang.IllegalStateException:The specified child already has a parent.的相关文章

java.lang.IllegalStateException: The specified child already has a parent. You must call removeView

?? java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first. 在android代码中假设出现此异常,说明在同一个布局中加入了同样的组件实例.应该创建不同的实例组件,并将其加入到布局其中.

Caused by: java.lang.IllegalStateException: The specified child already has a parent. You

ViewPager 报错:Caused by: java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first. 一中是removeView这个问题很常见的,具体解决方法就不谈了,另外一种是情况如下: adapter=new ViewPagerAdapter(Views); views>>  view

Fragment java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState

首先描述下所要实现的功能点: MainActivity使用Fragment实现底部菜单,底部共有四个菜单按钮,分别对应:AFragment,BFragment,CFragment,DFragment.其中AFragment是默认显示. 点击CFragment中的一个button后跳转到第二个Activity界面:SecondActivity. SecondActivity返回键有两个:button01.button02.其中button01返回的是CFragment:button02返回的是AF

android异常java.lang.IllegalStateException: getDatabase called recursively问题

问题场景: 在app首次启动使用到db的时候,后台提示如下错误信息 java.lang.IllegalStateException: getDatabase called recursively at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:204) at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase

Android - 错误: java.lang.IllegalStateException: Already attached

错误: java.lang.IllegalStateException: Already attached 本文地址: http://blog.csdn.net/caroline_wendy 可能原因: @Override protected void onContinueCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } onContinueCreate和重写onCreate方法不一致; 修改为:

异常java.lang.IllegalStateException的解决

在初始化viewPagerAdapter时,显示异常.从网上找了找有两类这样的问题,一种是说给一个视图设置了两个父类,如: TextView tv = new TextView();layout.adView(tv);layout2.adView(tv);这样就会报异常,需要先在其父视图中释放才能添加到另一个父视图 第二种是说:初始化时使用inflater可能出现异常 View result = inflater.inflate(R.layout.customer_layout, contain

Android IllegalStateException: The specified child already has a parent问题解决办法

最近遇到一个很让人头疼的问题,使用viewpager动态添加页面或者删除页面时出现了问题(java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first),在stackoverflow上找到了解决办法.(http://stackoverflow.com/questions/22936886/java-l

Android开发:java.lang.IllegalStateException报错

常见于ListView列表刷新数据时,更改UI. LOG: The content of the adapter has changed but ListView did not receive a notification. Make sure the content of your adapter is not modified from a background thread, but only from the UI thread. DDMS中的log无法定位到准确的出错位置.检查错误可

android 修改listview中adapter数据时抛出异常java.lang.IllegalStateException: The content of the adapter has changed but ListView did not receive a notification问题

近日在做项目时遇到非必现crush,具体异常信息为: // Short Msg: java.lang.IllegalStateException // Long Msg: java.lang.IllegalStateException: The content of the adapter has changed but ListView did not receive a notification. Make sure the content of your adapter is not mo