当我们想在一个layout组件中用java代码动态添加一个button时,我们可能直接用addView(view v)方法来添加组件。比如,我们想在一个linearlayout中添加一个button,而该button布局直接用xml来定义:
button.xml:
<Button
android:layout_width:100dp
android:layout_height:100dp/>
这就是整个xml的内容,button的宽高都是100dp。当我们用layoutinflater.inflate(R.layout.button,null)将该布局实例化并添加到视图中后,显示的结果却不争取:button的宽高都不是100dp,而是仅仅是内容大小(wrap_content)。
这是因为我们在inflate方法中,第二个参数为null导致的。实际上,layout_width是相对于布局的高,只有在这个组件处于一个布局中时,该宽高才有效。而当inflate方法第二个参数为空时,layout_width和layout_height都失去了意义。因此,我们需要将原先的button定义在一个layout之中,该layout的layout_height和layout_width随便设置,因为同刚才所说的,该layout由于没有指定根组件,所以其宽高无效,但是其内部组件的宽高有效了。所以,如果我们要让外出的layout宽高继续有效,则还要在外面嵌套一个layout,同理,最外层的layout在inflate方法第二个参数为null时依然指定宽高无效。
换句话说,当调用infla方法时,如果第二个参数为null,则实例化的布局对象最外层组件的layout_width和layout_height因为没有外层布局,都被替换为默认的宽高参数,即wrap_content