第一种方式。
1 先创建这样一个自定义控件
public class CustomView extends View {
Paint paint;
public CustomView(Context context) {
super(context);
init(context,null);
}
public CustomView(Context context, AttributeSet attrs) {
super(context, attrs);
System.out.println("两个参数的构造函数");
init(context,attrs);
}
public CustomView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init(context,attrs);
}
private void init(Context context, AttributeSet attrs) {
paint = new Paint();
paint.setColor(Color.RED);
paint.setTextSize(25.0f);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawText("一个view里面画出来的一句话", 11, 111, paint);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
}
2 在布局中取加载它
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.android.com/apk/res/android"
xmlns:dl="http://schemas.android.com/apk/res/cn.itheima.customview"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<!-- dl中可用的属性为在attr.xml中定义的属性 -->
<cn.itheima.customview.CustomView // 这个就是一个类似button的控件了
android:layout_width="fill_parent"
android:layout_height="fill_parent"
dl:textColor="#ff00ff00"
dl:textSize="25dip" >
</cn.itheima.customview.CustomView>
</LinearLayout>
3 加载这个布局就好了
//布局文件中使用了自定义控件
public class CustomViewActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
}
第二种方式
1 线创建个View类
public class MainView extends FrameLayout implements View.OnClickListener{
private Context mContext;
private Activity mActivity;
private Button mArgButton;
private Button mGlobleButton;
private Button mExitButton;
public MainView(Context context){
super(context);// ????????? 这句话的作用
setupViews();
}
public MainView(Context context, AttributeSet attrs) {
super(context, attrs);
setupViews();
}
private void setupViews(){
//获取View的上下文.
mContext = getContext();
//1 利用了多态的特性
//这里将Context转换为Activity. 。
mActivity = (Activity)mContext;
// 2 动态添加布局文件
LayoutInflater inflater = LayoutInflater.from(mContext);
View v = inflater.inflate(R.layout.activity_main, null);
addView(v); // add View()
// 3 多个button监听一个事件
mArgButton = (Button)v.findViewById(R.id.arg_button);
mGlobleButton = (Button)v.findViewById(R.id.glo_button);
mExitButton = (Button)v.findViewById(R.id.exit_button);
mArgButton.setOnClickListener(this);
mGlobleButton.setOnClickListener(this);
mExitButton.setOnClickListener(this);
}
public void onClick(View v) {
if(v == mArgButton){
ToolUtils.showToast(mContext, "我是通过传递Context参数显示的!");
}else if(v == mGlobleButton){
ToolUtils.showToast("我是通过全局Context显示的!");
}else{
mActivity.finish();
}
}
}
2 在activity中加载这个View
public class ApplicationDemoActivity extends Activity {@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 1 创建自定义的视图 传递上下文。2 在构造函数中调用设置视图的方法
MainView mMainView = new MainView(this);
setContentView(mMainView);
}
}