setPadding()無效的原因分析

在ListView中經常使用view.setPadding(left, top, right, bottom)來實現下拉和上拉的效果(view代表headerView或footerView),主要設置top值即可。

我現在在寫一個自定義控件,裏面就用到了這個setPadding( ),view的高度是給定的,結果就直接代碼創建了一個View,通過LayouParams設置它的高度值爲給定值,效果死活出不來,百度了一圈也沒找到答案。

View view = new View(getContext());
AbsListView.LayoutParams viewParams = new AbsListView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, 60);
view .setLayoutParams(viewParams);

// 添加HeaderView
view.setPadding(0, -60, 0, 0);
mListView.addHeaderView(view);

當然有其他辦法可以解決,但不知道原因,下次肯定還會碰到,不行,得弄明白。在經歷一波又一波的測試與思考中,終於找到了原因。

在其最大高度是我們設定數值的情況下,要使setPadding( )有效果,能動態改變高度,必須滿足兩個條件:
(1)view必須是ViewGroup子類;
(2)父控件高度必須是包裹內容wrap_content。

後來仔細想想,padding值就是內邊距,如果要改變高度,高度的設置肯定是wrap_content。且我們需要的最大高度都是固定的,很多時候都是用佈局文件來寫,所以裏面需要子控件來控制其高度,無論是數值,還是wrap_content,總有能確定其高度的。

下面根據view的控件類型和高度,得出幾種情況:

【1】view是一個最終子控件(即不能包含子控件的控件,如TextView、View),高度是數值。如果是TextView,內部的Text文本位置會變,但總高度不變。——無效

【2】view是一個最終子控件,高度是wrap_content。如果是TextView,內部的Text文本位置會變,總高度也會變。但總高度值不確定,需要完整地測量出來後才能獲取——視情況選擇

【3】view是一個ViewGroup子類,高度是數值。與【1】一樣,內部子控件會發生位置變化,但總高度不變。——無效

【4】view是一個ViewGroup子類,高度是wrap_content。內部子控件位置變化,總高度也會變。由子控件來控制總高度,OK。——有效。

給一個效果圖,用xml佈局文件畫出來,不成問題。但真正理解了嗎?以上就是沒真正理解透造成的初級Bug。理解了這個,最初被我淘汰的一種方案好像又死灰復燃了。

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