Android自定义控件

来源:互联网 发布:gps工作原理 知乎 编辑:程序博客网 时间:2024/06/08 14:03

出自:http://www.92coding.com/blog/index.php/archives/143.html


今天和大家分享下组合控件的使用。很多时候android自定义控件并不能满足需求,如何做呢?很多方法,可以自己绘制一个,可以通过继承基础控件来重写某些环节,当然也可以将控件组合成一个新控件,这也是最方便的一个方法。今天就来介绍下如何使用组合控件,将通过两个实例来介绍。
第一个实现一个带图片和文字的按钮,如图所示:
<a href="http://blog.92coding.com/wp-content/uploads/2012/01/12.jpg" class="cboxElement" rel="example4" 143"="" style="text-decoration: initial; color: rgb(1, 150, 227);">若水工作室
整个过程可以分四步走。第一步,定义一个layout,实现按钮内部的布局。代码如下:
custom_button.xml

1<?xmlversion="1.0"encoding="utf-8"?> 
2<LinearLayoutxmlns:android=http://schemas.android.com/apk/res/android" 
3    android:orientation="horizontal" 
4    android:layout_width="fill_parent" 
5    android:layout_height="fill_parent"
6    
7 <ImageView 
8  android:id="@+id/iv" 
9     android:layout_width="wrap_content" 
10     android:layout_height="wrap_content" 
11     android:layout_gravity="center_vertical"
12     android:paddingLeft="10.0dip"
13     android:paddingTop="10.0dip"
14     android:paddingBottom="10.0dip"
15     /> 
16 <TextView 
17  android:id="@+id/tv" 
18     android:layout_width="wrap_content" 
19     android:layout_height="wrap_content" 
20     android:textColor="#ffffff" 
21     android:layout_marginLeft="8dip" 
22     android:layout_gravity="center_vertical" 
23     android:paddingLeft="5.0dip"
24     android:paddingTop="10.0dip"
25     android:paddingBottom="10.0dip"
26     android:paddingRight="10.0dip"
27     android:textSize="18.0sp"
28     /> 
29</LinearLayout>

这个xml实现一个左图右字的布局,接下来写一个类继承LinearLayout,导入刚刚的布局,并且设置需要的方法,从而使的能在代码中控制这个自定义控件内容的显示。代码如下:
CustomButton.java

1packagecom.szy.customview;
2 
3importandroid.content.Context;
4importandroid.util.AttributeSet;
5importandroid.view.LayoutInflater;
6importandroid.widget.ImageView;
7importandroid.widget.LinearLayout;
8importandroid.widget.TextView;
9 
10/**
11 *@author coolszy
12 *@date 2011-12-20
13 *@bloghttp://blog.92coding.com/
14 */
15publicclass CustomButton extendsLinearLayout
16{
17 
18 privateImageView iv;
19 privateTextView tv;
20 
21 publicCustomButton(Context context)
22 {
23  this(context,null);
24 }
25 
26 publicCustomButton(Context context, AttributeSet attrs)
27 {
28  super(context, attrs);
29  // 导入布局
30  LayoutInflater.from(context).inflate(R.layout.custom_button,this,true);
31  iv = (ImageView) findViewById(R.id.iv);
32  tv = (TextView) findViewById(R.id.tv);
33 }
34 
35 /**
36  * 设置图片资源
37  */
38 publicvoid setImageResource(intresId)
39 {
40  iv.setImageResource(resId);
41 }
42 
43 /**
44  * 设置显示的文字
45  */
46 publicvoid setTextViewText(String text)
47 {
48  tv.setText(text);
49 }
50}

第三步,在需要使用这个自定义控件的layout中加入这控件,只需要在xml中加入即可。方法如下:
main.xml

1<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
2 android:layout_width="fill_parent" 
3 android:layout_height="fill_parent" 
4 android:orientation="vertical" 
5 
6 <com.szy.customview.CustomButton
7     android:id="@+id/bt_confirm" 
8     android:layout_width="wrap_content"
9     android:layout_height="wrap_content" 
10     android:background="@drawable/button_bg" 
11     /> 
12 <com.szy.customview.CustomButton
13     android:id="@+id/bt_cancel" 
14     android:layout_width="wrap_content"
15     android:layout_height="wrap_content" 
16     android:background="@drawable/button_bg" 
17    /> 
18</LinearLayout>

注意的是,控件标签使用完整的类名即可。为了给按钮一个点击效果,你需要给他一个selector背景,这里就不说了。
最后一步,即在activity中设置该控件的内容。当然,在xml中也可以设置,但是只能设置一个,当我们需要两次使用这样的控件,并且显示内容不同时就不行了。在activity中设置也非常简单,我们在CustomButton这个类中已经写好了相应的方法,简单调用即可。代码如下:

1packagecom.szy.customview;
2 
3importandroid.app.Activity;
4importandroid.os.Bundle;
5importandroid.view.View;
6importandroid.view.View.OnClickListener;
7 
8publicclass MainActivity extendsActivity
9{
10 privateCustomButton btnConfirm;
11 privateCustomButton btnCancel;
12 
13 @Override
14 publicvoid onCreate(Bundle savedInstanceState)
15 {
16  super.onCreate(savedInstanceState);
17  setContentView(R.layout.main);
18  btnConfirm = (CustomButton) findViewById(R.id.bt_confirm);
19  btnCancel = (CustomButton) findViewById(R.id.bt_cancel);
20 
21  btnConfirm.setTextViewText("确定");
22  btnConfirm.setImageResource(R.drawable.confirm);
23  btnCancel.setTextViewText("取消");
24  btnCancel.setImageResource(R.drawable.cancel);
25 
26  btnConfirm.setOnClickListener(newOnClickListener()
27  {
28   @Override
29   publicvoid onClick(View v)
30   {
31    // 在这里可以实现点击事件
32   }
33  });
34 }
35}

这样,一个带文字和图片的组合按钮控件就完成了。这样梳理一下,使用还是非常简单的。组合控件能做的事还非常多,主要是在类似上例中的CustomButton类中写好要使用的方法即可。
再来看一个组合控件,带删除按钮的EidtText。即在用户输入后,会出现删除按钮,点击即可取消用户输入。
定义方法和上例一样。首先写一个自定义控件的布局:
custom_editview.xml

1<?xmlversion="1.0"encoding="utf-8"?> 
2<RelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android" 
3    android:layout_width="fill_parent" 
4    android:layout_height="fill_parent" 
5    
6 <EditText 
7     android:id="@+id/et" 
8     android:layout_width="fill_parent" 
9     android:layout_height="wrap_content" 
10     android:singleLine="true" 
11     /> 
12 <ImageButton 
13     android:id="@+id/ib" 
14     android:visibility="gone" 
15     android:src="@drawable/cancel" 
16     android:layout_width="wrap_content" 
17     android:layout_height="wrap_content" 
18     android:background="#00000000" 
19     android:layout_alignRight="@+id/et"/> 
20</RelativeLayout>

实现输入框右侧带按钮效果,注意将按钮隐藏。然后写一个CustomEditView类,实现删除用户输入功能。这里用到了TextWatch这个接口,监听输入框中的文字变化。使用也很简单,实现他的三个方法即可。看代码:
CustomEditView.java

1packagecom.szy.customview;
2 
3importandroid.content.Context;
4importandroid.text.Editable;
5importandroid.text.TextWatcher;
6importandroid.util.AttributeSet;
7importandroid.view.LayoutInflater;
8importandroid.view.View;
9importandroid.widget.EditText;
10importandroid.widget.ImageButton;
11importandroid.widget.LinearLayout;
12 
13/**
14 *@author coolszy
15 *@date 2011-12-20
16 *@bloghttp://blog.92coding.com/
17 */
18publicclass CustomEditView extendsLinearLayout implementsEdtInterface
19{
20 ImageButton ib;
21 EditText et;
22 
23 publicCustomEditView(Context context)
24 {
25  super(context);
26 
27 }
28 publicCustomEditView(Context context, AttributeSet attrs)
29 {
30  super(context, attrs);
31  LayoutInflater.from(context).inflate(R.layout.custom_editview,this,true);
32  init();
33 
34 }
35 privatevoid init()
36 {
37  ib = (ImageButton) findViewById(R.id.ib);
38  et = (EditText) findViewById(R.id.et);
39  et.addTextChangedListener(tw);// 为输入框绑定一个监听文字变化的监听器
40  // 添加按钮点击事件
41  ib.setOnClickListener(newOnClickListener()
42  {
43   @Override
44   publicvoid onClick(View v)
45   {
46    hideBtn();// 隐藏按钮
47    et.setText("");// 设置输入框内容为空
48   }
49  });
50 
51 }
52 // 当输入框状态改变时,会调用相应的方法
53 TextWatcher tw = newTextWatcher()
54 {
55   
56  @Override
57  publicvoid onTextChanged(CharSequence s, intstart, intbefore, intcount)
58  {
59   // TODO Auto-generated method stub
60 
61  }
62   
63  @Override
64  publicvoid beforeTextChanged(CharSequence s, intstart, intcount, intafter)
65  {
66   // TODO Auto-generated method stub
67 
68  }
69   
70  // 在文字改变后调用
71  @Override
72  publicvoid afterTextChanged(Editable s)
73  {
74   if(s.length() == 0)
75   {
76    hideBtn();// 隐藏按钮
77   }else
78   {
79    showBtn();// 显示按钮
80   }
81  }
82 };
83 
84 @Override
85 publicvoid hideBtn()
86 {
87  // 设置按钮不可见
88  if(ib.isShown())
89   ib.setVisibility(View.GONE);
90 
91 }
92 
93 @Override
94 publicvoid showBtn()
95 {
96  // 设置按钮可见
97  if(!ib.isShown())
98  {
99   ib.setVisibility(View.VISIBLE);
100  }
101 }
102}
103 
104interfaceEdtInterface
105{
106 publicvoid hideBtn();
107 publicvoid showBtn();
108}

在TextWatch接口的afterTextChanged方法中对文字进行判断,若长度为0,就隐藏按钮,否则,显示按钮。
另外,实现ImageButton(即那个叉)的点击事件,删除输入框中的内容,并隐藏按钮。
后面两步的实现就是加入到实际布局中:
main.xml

1<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
2 android:layout_width="fill_parent" 
3 android:layout_height="fill_parent" 
4 android:orientation="vertical" 
5 >
6 <com.szy.customview.CustomEditView
7  android:layout_width="fill_parent"
8     android:layout_height="wrap_content" 
9    />
10</LinearLayout
11  

最后显示效果如图:
<a href="http://blog.92coding.com/wp-content/uploads/2012/01/21.jpg" class="cboxElement" rel="example4" 143"="" style="text-decoration: initial; color: rgb(1, 150, 227);">若水工作室

源码下载地址:http://115.com/file/aq5qvh67


原创粉丝点击