zoukankan      html  css  js  c++  java
  • Android layoutInflate.inflate 方法具体解释,removeView()错误解决

    错误:

    The specified child already has a parent. You must call removeView()。

    解答:
    这个错误非常直白,就是你viewGroup.addView(childView); 中childView已经有父View了。错误原因非常多,我主要讲下 mLayoutInflater.inflate(id, rootView, false);造成的这个错误。(该方法有两种。一种是2个參数,一种是3个參数)。

    2个參数:
    第一个參数:layout的XML文件id。
    第二个參数:将XML文件里的根view,作为子View加入到的那个父View。也就是父View布局
      a:假设rootView非空,方法返回值是rootView(rootView已加入xml代表的子View)。
    b:假设rootView为空,方法直接返回子Viewxml代表的子View)。那么XML文件里的LayoutParams就无效了。(由于LayoutParams是给该XML代表的View的父View使用。

    在父View的onMeasure()中依据LayoutParams是MATCH_PARENT还是WRAP_CONTENT,来測量子View的大小。假设没有父View就不是必需了

    故用mLayoutInflater.inflate(id, rootView)。返回的实际上是rootView,而rootView肯定已经有父布局了(DecorateView,系统生成的)。所以 rootView.addView(mLayoutInflater.inflate(id, rootView)).等价于rootView.addView(rootView).所以错了。


    3个參数:
    问题来了。如何修复b情况。既保留XML文件里的LayoutParams属性,又不想有方法return父View。
    两步 rootView != null (是那个对象随便),第三个參数 == false;mLayoutInflater.inflate(id, rootView, false);这样就能够不attach root view。又保留LayoutParams。


  • 相关阅读:
    hdu 1305 Immediate Decodability
    hdu1247 Hat’s Words
    hdu 1251 统计难题 前缀出现次数
    hdu 3308 线段树,单点更新 求最长连续上升序列长度
    java内部类
    Fckeditor编辑器的安全问题
    Net-NTLMv1的利用
    redis提权
    windows认证过程
    c/c++中system函数在Linux和windows下区别
  • 原文地址:https://www.cnblogs.com/lcchuguo/p/5159797.html
Copyright © 2011-2022 走看看