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


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


好多人看到这个标题就想说,呵呵哒

其实博主的目的是教会大家一些实用的开发技巧,帮助你渡过技术难关,让你遇见新大陆

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的方式直接获取了

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