MainActivity如下:
package cc.testviewstudy1; import android.os.Bundle; import android.app.Activity; import android.view.LayoutInflater; import android.view.View; import android.view.ViewParent; import android.widget.RelativeLayout; /** * Demo描述: * 关于自定义View的学习(一) * * 学习资料: * http://blog.csdn.net/guolin_blog/article/details/12921889 * Thank you very much * */ public class MainActivity extends Activity { private RelativeLayout mRelativeLayout; private LayoutInflater mLayoutInflater; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); init(); //test1(); test2(); test3(); } //每个Activity由两部分组成. //1 title //2 contentView //我们可以分别设置它们 private void init(){ setTitle("This is title"); setContentView(R.layout.main); } //用button_layout_wrong布局的方式来在View中新加一个Button //是不够准确的.因为此时我们是无法通过 android:layout_width和 android:layout_height //指定Button的宽和高,最终Button显示的只有wrap_content的大小. private void test1(){ mRelativeLayout=(RelativeLayout) findViewById(R.id.relativeLayout); mLayoutInflater=LayoutInflater.from(MainActivity.this); View buttonView=mLayoutInflater.inflate(R.layout.button_layout_wrong, null); mRelativeLayout.addView(buttonView); } //怎么解决test1中的问题呢? //关键在于android:layout_width和 android:layout_height的理解 //它指的是的控件在布局中的宽和高所以叫android:layout_width和 android:layout_height //而不是叫android:width和 android:height. //所以,我们要先把控件放在一个布局里面,然后再给该控件指定宽和高.这样才有效果. //如:button_layout_right所示 private void test2(){ mRelativeLayout=(RelativeLayout) findViewById(R.id.relativeLayout); mLayoutInflater=LayoutInflater.from(MainActivity.this); View buttonView=mLayoutInflater.inflate(R.layout.button_layout_right, null); mRelativeLayout.addView(buttonView); } //继续上面的例子: //我们在每次布局的时候不是可以在最外层的布局通过android:layout_width和 android:layout_height //来指定该布局的宽和高么然后setContentView()将其显示在屏幕上的么? //这个最大的View没有再嵌套一层布局为什么可以指定宽和高呢? //这不是和上面的例子冲突了么? //其实,不是的. //因为在加载每个布局文件xml的时候.不论其根布局是什么,都会将该布局 //外面嵌套一层FrameLayout. //这样就和上面的例子统一了. private void test3(){ mRelativeLayout=(RelativeLayout) findViewById(R.id.relativeLayout); ViewParent viewParent=mRelativeLayout.getParent(); System.out.println("每个布局文件的最外层的实质是:"+viewParent); } }
main.xml如下:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/relativeLayout" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/hello_world" android:layout_centerInParent="true" /> </RelativeLayout>
button_layout_wrong.xml如下:
<Button xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="200dp" android:layout_height="20dp" android:textSize="30sp" android:text="Button" > </Button>
button_layout_right.xml如下:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" > <Button android:layout_width="200dp" android:layout_height="200dp" android:text="Button" android:textSize="30sp"> </Button> </RelativeLayout>