Android自定义View的学习(一)

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>




Android自定义View的学习(一)

上一篇:Android 超高仿微信图片选择器 图片该这么加载


下一篇:微信公众平台网页授权获取用户基本信息中授权回调域名设置的变动