典型错误案例:
经常我们会通过addView方法,动态添加一些子布局,比如下面的一段代码.
LinearLayout linParent = (LinearLayout) findViewById(R.id.aty_slider_linParent);
View vChild = mInflater.inflate(R.layout.view_loding, null);
linParent.addView(vChild);
view_loading是一个布局文件:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:orientation="horizontal" >
</LinearLayout>

按理说,view_loding所属的布局控件会完全填充满linParent的,但是实际的效果与预想不同,只是自适应大小而已。


原因分析:
查看addView方法的源码如下
public void addView(View child) {
addView(child, -1);
}
再查看addView的另外一个重载方法
public void addView(View child, int index) {
LayoutParams params = child.getLayoutParams();
if (params == null) {
params = generateDefaultLayoutParams();
if (params == null) {
throw new IllegalArgumentException("generateDefaultLayoutParams() cannot return null");
}
}
addView(child, index, params);
}
里面有句话child.getLayoutParams(),而getLayoutParams方法说明中有句话为:This method may return null if this View is not attached to a parent ViewGroup。意思就是如果没有被添加至父控件时,结果是会返回null的,很显然,到目前的代码跟踪情况来看,vChild还没有被添加至linParent,所以会去调用generateDefaultLayoutParams()方法,而generateDefaultLayoutParams的方法实现如下:
protected LayoutParams generateDefaultLayoutParams() {
return new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
}
所以就很明显的造成了子布局android:layout_width="match_parent"属性失效。


解决方案:
当addView方法完成之后,重新设置子控件vChild的LayoutParams属性即可。
vChild.setLayoutParams(new android.widget.LinearLayout.LayoutParams(
android.widget.LinearLayout.LayoutParams.MATCH_PARENT,
android.widget.LinearLayout.LayoutParams.MATCH_PARENT));
其中的LayoutParams所属类必须为linParent 的类型,否则会有bug的哦。

更多相关文章

  1. [置顶] Android(安卓) ExpandableListView
  2. 分析通话记录信息是通过什么写入的 android 源码 保存通话记录
  3. Android(安卓)ConstraintLayout布局详解
  4. Android加载长图之Scrollview嵌套ImageView
  5. android 移动图片
  6. Android(安卓)Studio 安装No JVM Installation found. Please in
  7. andorid中的html.fromhtml方法
  8. android 自定义view中onMeasure()
  9. Android(安卓)用户界面(User Interface)

随机推荐

  1. Android 监听软键盘弹起和收起事件
  2. 【转】详解android:scaleType属性
  3. android: layout_alignParentRight androi
  4. Android之ScrollLayout左右滑动效果实现
  5. Android Context
  6. android 图片溢出问题2...[geoway]
  7. Android List divider显示不出来的问题
  8. Android中状态栏的隐藏
  9. Android 中OpenGL的使用
  10. Android开发--Intent-filter属性详解