問題描述
昨天在寫一個自定義控件的時候遇到一個問題,就是我通過addView(View child) 方法添加View之后再7.0上沒有顯示出來缨历,6.0上沒有問題盗蟆。通過AS自帶的Layout Inspector工具檢查發(fā)現(xiàn)我的自定義控件的寬高都是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);
}
}
解決思路
其實沒有任何解決思路榜聂,在網(wǎng)上也找了很久∧淠耍基本沒人遇到過我這樣的問題。只發(fā)現(xiàn)有一個百度貼吧里面有這個問題幢炸,但是也沒有人給出有效的答案。
解決辦法
因為沒有人給出有效的解決辦法佛嬉,也看不懂6.0和7.0源碼的差別所以只能憑借經(jīng)驗添加代碼了暖呕。我調(diào)試的過程就不說了,那叫一個酸爽(說多了都是淚扮志尽4写尽)只說我的最終解決辦法吧:
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上必須要調(diào)用這段代碼,否則view不會被測量皿桑、排版、繪制镀虐。
}
}
補充
雖然問題解決了沟绪,但是我研究了半天的源碼也沒弄明白是為什么。如果有哪路大神路過又恰巧知道原因的話麻煩再下面留個言绽慈,小弟感激涕零。謝謝搜贤!