美文网首页
如何动态获取LayoutParams布局类型,避免实例化 Lay

如何动态获取LayoutParams布局类型,避免实例化 Lay

作者: 代码改变人生 | 来源:发表于2018-08-25 15:03 被阅读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来生成对象.

    相关文章

      网友评论

          本文标题:如何动态获取LayoutParams布局类型,避免实例化 Lay

          本文链接:https://www.haomeiwen.com/subject/vktgiftx.html