如何动态获取LayoutParams布局类型,避免实例化 Lay
2018-08-25 本文已影响0人
代码改变人生
本文说两点
1、LayoutParams的几个小特点;
2、LayoutParams的使用小结;
3、如何动态获取LayoutParams布局类型。
一.LayoutParams的几个小特点
LayoutParams 作用:子控件用来告诉父控件自己要如何布局
LayoutParams 是ViewGroup的一个内部类,这是一个基类,主要描述了宽高.
宽与高有三种指定方式
MATCH_PARENT 填充父窗体
WRAP_CONTENT 包裹内容
an exact number 精准描述
每一个继承自ViewGroup的容器比如RelativeLayout等自己对应的LayoutParams,而且这些LayoutParams又有自己独特的属性,比如RelativeLayout.LayoutParams可以设置RelativeLayout.RIGHT
RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(vgLp);
params.addRule(RelativeLayout.RIGHT_OF,R.id.mTvBlue);
子控件在获取LayoutParams一定要和当前父控件的容器类型保持一致。
比如TextView是在LinearLayout下面的,那么LayoutParams就必须是 LinearLayout.LayoutParams。
比如上面例子代码中的
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(params.getLayoutParams());
params.width = dip2px(this,200);
params.height = dip2px(this,50);
textView.setLayoutParams(params );
二、LayoutParams的使用小结
step 1、获得对应父窗体类型的LayoutParams
RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(textView.getLayoutParams());
step 2、对控件本身的宽高和特有的属性比如对齐方式等进行设置
params .width = dip2px(this,200);
params .height = dip2px(this,50);
step 3、利用setLayoutParams方法对控件的layout进行布局更新
textView.setLayoutParams(params );
三、如何动态获取LayoutParams布局类型
以上过程很麻烦,当LayoutParams类型不对时程序分分钟抛出异常,而且每次都要去布局里面找相应的父布局,然后才能生成相应的LayoutParams对象。
优化方法:使用反射生成view相对应的LayoutParams对象。
Class<? extends ViewGroup.LayoutParams> LayoutParamsClass=imageView.getLayoutParams().getClass();
imageView.setLayoutParams( LayoutParamsClass.getDeclaredConstructor(int.class,int.class).newInstance(1080,getBitmapHeight(bitmap));
imageView.getLayoutParams().getClass()拿到类名,getDeclaredConstructor调用其有参数的构造方法,newInstance来生成对象.