一般继承自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);
}
}