如何动态获取LayoutParams布局类型,避免实例化 LayoutParams时出现与父View的LayoutParams不一致的问题?

本文说两点

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 LayoutParamsClass=imageView.getLayoutParams().getClass();
imageView.setLayoutParams( LayoutParamsClass.getDeclaredConstructor(int.class,int.class).newInstance(1080,getBitmapHeight(bitmap));

imageView.getLayoutParams().getClass()拿到类名,getDeclaredConstructor调用其有参数的构造方法,newInstance来生成对象.

你可能感兴趣的:(如何动态获取LayoutParams布局类型,避免实例化 LayoutParams时出现与父View的LayoutParams不一致的问题?)