自定義控制元件不顯示,,,,,,填坑
自定義控制元件分為繼承View和繼承ViewGroup,兩者不同。
1、繼承View 必須重寫 onLayout() 、onDraw()
因為View相當於沒什麼形狀的控制元件,需要你去重寫onDraw() 去自己畫出來。重寫onLayout() 為了指定 畫在哪裡。
2、繼承ViewGroup 必須重寫 onMeasure()、onLayout()
因為ViewGroup需要新增view進去,這裡的view是指Android已經幫你畫好的控制元件。但是手機不知道這個控制元件應該畫多大,畫在什麼位置。所以要重寫這個兩個方法。而不用重寫onDraw()。
下面說繼承ViewGroup 我爬過的坑。
1、重寫onMeasure()方法,一定要在最後設定這個自定義控制元件的測量值 setMeasuredDimension();
2、如果給自定義控制元件,加入的控制元件還是ViewGroup的控制元件組,(繼承ViewGroup的也算,如LinearLayout)。在重寫的onMeasure()中,也一定要對 自定義控制元件的 childs 測量。如下程式碼 : child.measure(child.getWidth(),child.getHeight()) 否則會導致控制元件不顯示
因為自定義控制元件的 子控制元件還是繼承ViewGroup的控制元件 所以還是需要測量大小。(自己的理解,不一定對。搜了許久沒有看到合理解釋)
3、關於setMeasuredDimension() 引數的選擇。這個方法是設定 自定義控制元件 的大小。所以如果自定義控制元件的屬性是 match_parent或者固定的數值,直接寫 onMeasure()的兩個引數就行,widthMeasureSpec和heightMeasureSpec 如果自定義控制元件的屬性是 warp_content 就需要測量子控制元件的大小,把所有子控制元件所需要的長寬 當成引數,寫到這個方法裡。