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不會被測量、排版、繪製。
        }
    }

補充

雖然問題解決了,但是我研究了半天的源碼也沒弄明白是爲什麼。如果有哪路大神路過又恰巧知道原因的話麻煩再下面留個言,在下感激涕零。如果我的方法解決了你的問題也麻煩幫忙贊一個。謝謝!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章