ITEEDU

自定义控件

一般继承自Layout,用LayoutInflater.from(context).inflate(R.layout.myview, this, true);初始内容。

下面构造函数是必须的,想在xml中用定义的控件就要有。xml布局文件中设置的属性对应AttributeSet attrs参数。

	public MyView(Context context, AttributeSet attrs) {
		super(context, attrs);
		// TODO Auto-generated constructor stub
		c = context;
		LayoutInflater.from(context).inflate(R.layout.myview, this, true);
		
	}

下面的函数也是有必要的,想在代码中创建控件可能用到这个构造参数。

	public MyView(Context context) {
		super(context);
		// TODO Auto-generated constructor stub
		c = context;
		LayoutInflater.from(context).inflate(R.layout.myview, this, true);
	}

示例

控件中有一个gallery和一个TextView,TextView自动显示gallery中当前view的一些信息。

myview.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >


    <Gallery
        android:id="@+id/gallery"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" />


    <TextView
        android:id="@+id/info"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="TextView" />

</LinearLayout>

MyView

package com.iteedu.myview;

import android.content.Context;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.Gallery;
import android.widget.LinearLayout;
import android.widget.TextView;

public class MyView extends LinearLayout {
	Gallery g;
	TextView info;
	Context c;

	public MyView(Context context) {
		super(context);
		// TODO Auto-generated constructor stub
		c = context;
		
		init();
	}

	public MyView(Context context, AttributeSet attrs) {
		super(context, attrs);
		// TODO Auto-generated constructor stub
		c = context;
		
		init();
	}

	private void init() {
		LayoutInflater.from(c).inflate(R.layout.myview, this, true);
		g = (Gallery) this.findViewById(R.id.gallery);
		info = (TextView) this.findViewById(R.id.info);
		g.setOnItemSelectedListener(new OnItemSelectedListener() {

			@Override
			public void onItemSelected(AdapterView<?> parent, View view,
					int position, long id) {
				// TODO Auto-generated method stub
				info.setText(parent.getItemAtPosition(position).toString());
			}

			@Override
			public void onNothingSelected(AdapterView<?> parent) {
				// TODO Auto-generated method stub

			}

		});
		g.setAdapter(new ImageAdapter(c));
	}
}

ImageAdapter

package com.iteedu.myview;

import android.content.Context;
import android.content.res.Resources;

import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;

import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ImageView.ScaleType;

public class ImageAdapter extends BaseAdapter {
	private Context mContext;
	private Integer[] mImageIds = { R.drawable.sample_2, R.drawable.sample_3,
			R.drawable.sample_4, R.drawable.sample_6 };

	public ImageAdapter(Context c) {
		mContext = c;

	}

	public int getCount() {
		return mImageIds.length;
	}

	public Object getItem(int position) {
		return mImageIds[position];
	}

	public long getItemId(int position) {
		return position;
	}

	public View getView(int position, View convertView, ViewGroup parent) {

		ImageView imageView = new ImageView(mContext);
		imageView.setImageDrawable(mContext.getResources().getDrawable(
				mImageIds[position]));
		return imageView;
	}

}

main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <com.iteedu.myview.MyView
        android:id="@+id/myView1"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" >
    </com.iteedu.myview.MyView>

</LinearLayout>

MyViewActivity

package com.iteedu.myview;

import android.app.Activity;
import android.os.Bundle;

public class MyViewActivity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }
}