3.addView调用之后导致子布局的android:layout_width="match_parent"属性或者 android:layout_width="fll_parent"属性无效。

典型错误案例:

经常我们会通过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的哦。

3.addView调用之后导致子布局的android:layout_width="match_parent"属性或者 android:layout_width="fll_parent"属性无效。,布布扣,bubuko.com

时间: 2024-12-20 08:25:27

3.addView调用之后导致子布局的android:layout_width="match_parent"属性或者 android:layout_width="fll_parent"属性无效。的相关文章

Android学习(四)——Android布局模式

除了上面我们谈过的控件外,其实还有非常多其他的.我们谈的基本都是非常基础的,因此其他的控件还需要学习者在后面制作中进行学习.除了这些组件外,我们还需要有一些东西把这些组件包含在内,这东西就是我们所说的布局. Android中有四种基本的布局模式(Layout):LinearLayout, RelativeLayout, TableLayout, FrameLayout  ———————————————————华丽丽的分割线—————————————————————— 1. LinearLayou

go语音之进阶篇主协程先退出导致子协程没来得及调用

1.主协程先退出导致子协程没来得及调用 示例: package main import ( "fmt" "time" ) //主协程退出了,其它子协程也要跟着退出 func main() { go func() { i := 0 for { i++ fmt.Println("子协程 i = ", i) time.Sleep(time.Second) } }() //别忘了() } 执行结果 (备注:没有结果,主协程退出,子协程也跟着退出了.) 原

android 当ListView滚动时自动调用 onCheckedChanged 导致CheckBox 状态不停变化 的解决办法

今天在做一个含有CheckBox 的ListView时,发现当初始化CheckBox的状态后, 滚动ListView,其中CheckBox 的选中状态不停的发生变化.最后发现原因是 ListView滚动时自动调用 onCheckedChanged 导致的.在查看了各种博客的解决办法后,国外的网站上有一个办法解决了我的问题.写下来分享一下. 在自定义Adapter的getView方法中这样写就行了. Java代码   //在初始化CheckBox状态和设置状态变化监听事件之前,先把状态变化监听事件

wxWidgets第十六课 wxTimer没有调用stop导致崩溃的问题分析

场景 调用wxTimer定时器功能的时候,如果关闭当前的窗口,会出现上述的问题:0xC0000005: 读取位置 0xFEEEFF06 时发生访问冲突 说明 跟踪调用堆栈的具体情况,代码崩溃点指向IMPLEMENT_APP(CTestApp) 调用堆栈指向: wxEntry(int &,wchar_t * *) 未知 wxEntry(struct HINSTANCE__ *,struct HINSTANCE__ *,char *,int) 未知 > WinMain(HINSTANCE__ *

android调用摄像头导致activity销毁的解决办法

APP里有一个上传头像,可以直接从相册选择图片上传,也可以使用照相机拍照上传.这个功能在大部分机器下都正常,然而在部分机器(例如三星)却失败,另外独立写了个测试例子检查这个问题. package com.penngo.camera; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.graphics.Bitmap; import an

Android笔记(八) Android中的布局——框架布局

框架布局没有任何定位方式,所有的控件都会摆放在布局的左上角. 代码示例: framelayout.xml <?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" androi

Android笔记(十一) Android中的布局——AndroidManiFest.xml

AndroidManiFest.xml清单文件是每个Android项目所必须的,它是整个Android应用的全局描述文件.AndroidManiFest.xml清单文件说明了该应用的名称.所使用的图标以及包含的组件等等. AndroidManiFest.xml清单文件通常包含如下信息: 1. 应用程序的包名,该包名将会作为该应用的唯一标识 2. 应用所包含的组件,如Activity.Service.BroadcastReceiver和ContentProvider等 3. 应用程序兼容的最低版本

Android笔记(六) Android中的布局——线性布局

我们的软件是由好多个界面组成的,而每个界面又由N多个控件组成,Android中借助布局来让各个空间有条不紊的摆放在界面上. 可以把布局看作是一个可以放置很多控件的容器,它可以按照一定的规律调整控件的位置,从而实现精美的界面. 布局中也可以放置布局,通过多层布局的嵌套,实现比较复杂的界面. Android提供了四种基本布局:LinearLayout.RelativeLayout.FrameLayout.TableLayout LinearLayout: LinearLayout称为线性布局,正如其

Android笔记(九) Android中的布局——表格布局

TableLayout运行我们使用表格的方式来排列控件,它的本质依然是线性布局.表格布局采用行.列的形式来管理控件,TableLayout并不需要明确的声明包含多少行多少列,而是通过添加TableRow.其他组件来控制表格的行数和列数. 每次向Table中添加一个TableRow,该TableRow就是一个表格行,TableRow也是容器,因此它也可以不断的添加其他组件,每添加一个子组件该表格就增加一列. 实例代码,实现一下简单的登录界面 tablelayout.xml <?xml versio