背景
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等等值,
新版本中,做了一个转换
总结
源码面前,了无秘密。
网友评论