Android 自定義View的一些使用技巧




好多人看到這個標題就想說,呵呵噠

其實博主的目的是教會大家一些實用的開發技巧,幫助你渡過技術難關,讓你遇見新大陸


廢話先不多說了,仔細的查看本文,因爲每一條經驗都是汗水和淚水凝結的精華


1:巧用View.inflate()

inflate函數是View的靜態函數,返回參數是一個View對象,主要功能是將一個.xml佈局轉換成一個view對象,函數的參數分別是:context,layoutID,GroupView
一般人寫的時候第三個參數都是傳一個null,問他爲什麼傳一個null,一撓頭說:我也不知道,別人都是這麼幹的。
private LinearLayout createLabelView(int iconColor,String labelText){
    LinearLayout itemLabelView =
            (LinearLayout) View.inflate(context,R.layout.view_item_label,null);
    View itemIconView = itemLabelView.findViewById(R.id.itemLabel_iconView);
    TextView itemTextView = itemLabelView.findViewById(R.id.itemLabel_textView);
    itemIconView.setBackgroundColor(iconColor);
    itemTextView.setText(labelText);
    return itemLabelView;
}

這段代碼中,第三個參數就傳遞了null

private void initView(){
    View.inflate(context, R.layout.base_view_pie_chart,this);
    pieChartView = findViewById(R.id.basePieChartView);
    labelLayout = findViewById(R.id.baseLabelLayout);
}
而在這段代碼中,我卻傳遞了一個this對象,這個this是誰呢?
public class BasePieChartView extends FrameLayout
這裏我繼承了FragmentLayout,可見,我傳遞了一個FragmentLayout的對象。
爲什麼要這麼幹?這麼幹有什麼意義嗎?
這樣做的意義是:當把一個xml格式的佈局轉換成一個view對象時,第三個參數的意義是把 誰 設爲這個view的父容器,如果這個不傳遞這個this的話,使用這個佈局前必須調用 this.addView(View.inflate(context,xxx,null)),否則是這個自定義的FramentLayout將顯示不到你引入的這個xml格式的View。傳遞這個this,就是把當前的FragmentLayout對象賦給這個xml格式的view,他們成爲同一個引用了。


2:巧用LayoutParams

LayoutParams是當前View的一些參數,比如:left邊距,top邊距,width,gravity 等屬性
LayoutParams對象可通過view.getLayoutParams() 獲取
但是獲取之前有一點小小規則:LinearLayout佈局,可在addView之後獲取,如果這個view是一個childView
並且已經添加了,那麼就沒問題。如果在還沒有添加的情況下就獲取則會出現空指針異常
LayoutParams在FragmentLayout中是不能直接get的,也是出現空指針,解決辦法就是new 一個LayoutParams
設置完參數後,再設置給這個FragmentLayout,如果再需要獲取,就可以通過get的方式直接獲取了







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