LayoutParam 高低版本兼容问题一则

背景

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 高低版本兼容问题一则)