美文网首页
LayoutParam 高低版本兼容问题一则

LayoutParam 高低版本兼容问题一则

作者: hi一一 | 来源:发表于2020-06-18 17:53 被阅读0次

    背景

    demo code

    public class MyViewGroup extends RelativeLayout {
        public MyViewGroup(Context context, AttributeSet attrs) {
            super(context, attrs);
    
            LayoutInflater.from(context).inflate(R.layout.layout_test, this, true);
            
            LinearLayout llContent = (LinearLayout) findViewById(R.id.llContent);
            //TODO  使用new LayoutParams  在低版本上(6.0以及下),不生效,见图一
            LayoutParams params = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT);
            //TODO  最佳实践,LinearLayout.LayoutParams ,见图二
    //        LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.MATCH_PARENT);
            for (int i = 0; i < 5; i++) {
                params.leftMargin = 200;
                TextView tv = new TextView(getContext());
                tv.setText("哈哈哈哈");
                tv.setTextSize(30);
                tv.setTextColor(Color.parseColor("#FF0000"));
                llContent.addView(tv, params);
            }
        }
    }
    
    

    图一(margin没有生效)


    image.png

    图二 (margin生效)


    image.png

    源码分析

    使用原生模拟器,分别debug api 23 和 api 27 ,可以轻松的知道源码;

    低版本 源码 (api23 )

    ViewGroup.java 的 addViewInner 方法L4317行:


    image.png

    高版本 源码(api27 )

    ViewGroup.java 的 addViewInner 方法L4946行:


    image.png

    说明:
    低版本没有对LayoutParam 进行特殊的处理,会忽略掉marin等等值,
    新版本中,做了一个转换

    总结

    源码面前,了无秘密。

    相关文章

      网友评论

          本文标题:LayoutParam 高低版本兼容问题一则

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