問題描述
昨天在寫一個自定義控件的時候遇到一個問題,就是我通過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不會被測量、排版、繪製。
}
}
補充
雖然問題解決了,但是我研究了半天的源碼也沒弄明白是爲什麼。如果有哪路大神路過又恰巧知道原因的話麻煩再下面留個言,在下感激涕零。如果我的方法解決了你的問題也麻煩幫忙贊一個。謝謝!