Android7.0 自定义控件addView(...)无效,View的绘制流程(onMeasure、onLayout等)完全没执行的解决办法。

问题描述

昨天在写一个自定义控件的时候遇到一个问题,就是我通过addView(View child) 方法添加View之后再7.0上没有显示出来,6.0上没有问题。通过AS自带的Layout Inspector工具检查发现我的自定义控件的宽高都是0,并且getVisibility()==VISIBLE,也就是说控件是显示的,只是没有宽高所以看不到。
先看下我addView的代码吧:

void setFloatContent(ViewGroup floatContent) {
        if (floatContent != null) {
            removeAllViews();
            ViewGroup parent = (ViewGroup) floatContent.getParent();
            if (parent != null) parent.removeView(floatContent);
            addView(floatContent);
        }
    }

解决思路

其实没有任何解决思路,在网上也找了很久。基本没人遇到过我这样的问题。只发现有一个百度贴吧里面有这个问题,但是也没有人给出有效的答案。

解决办法

因为没有人给出有效的解决办法,也看不懂6.0和7.0源码的差别所以只能凭借经验添加代码了。我调试的过程就不说了,那叫一个酸爽(说多了都是泪啊!)只说我的最终解决办法吧:

void setFloatContent(ViewGroup floatContent) {
        if (floatContent != null) {
            removeAllViews();
            ViewGroup parent = (ViewGroup) floatContent.getParent();
            if (parent != null) parent.removeView(floatContent);
            addView(floatContent);
            floatContent.requestLayout();  //只加了这一行代码。7.0上必须要调用这段代码,否则view不会被测量、排版、绘制。
        }
    }

补充

虽然问题解决了,但是我研究了半天的源码也没弄明白是为什么。如果有哪路大神路过又恰巧知道原因的话麻烦再下面留个言,小弟感激涕零。谢谢!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 174,159评论 25 709
  • ¥开启¥ 【iAPP实现进入界面执行逐一显】 〖2017-08-25 15:22:14〗 《//首先开一个线程,因...
    小菜c阅读 6,701评论 0 17
  • 没想到我做了这样的梦,虽然我睡觉特别爱做梦,但是一般我做梦的时候都是可以意识到自己在做梦的。 但是这个梦太过真实,...
    碳哥哥阅读 222评论 0 15
  • 我从不羡慕天生“瘦”的人。 比起天生瘦的人,我更羡慕那些曾经胖过的人,如今凭自己意志瘦下来的人! 这一群人都知晓,...
    禹亚楠阅读 424评论 2 2