很多时候android常用的控件不能满足我们的需求,那么我们就需要自定义一个控件了。今天做了一个自定义控件的实例,来分享下。
首先定义一个layout实现按钮内部布局:
01 | <?xml version="1.0" encoding="utf-8"?> |
02 | <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" |
03 | android:layout_width="fill_parent" |
04 | android:layout_height="fill_parent" |
05 | android:orientation="horizontal" > |
08 | android:id="@+id/imageView1" |
09 | android:layout_width="wrap_content" |
10 | android:layout_height="wrap_content" |
11 | android:layout_gravity="center_vertical" |
12 | android:paddingBottom="5dip" |
13 | android:paddingLeft="40dip" |
14 | android:paddingTop="5dip" |
15 | android:src="@drawable/right_icon" /> |
18 | android:id="@+id/textView1" |
19 | android:layout_width="wrap_content" |
20 | android:layout_height="wrap_content" |
21 | android:layout_gravity="center_vertical" |
22 | android:layout_marginLeft="8dip" |
24 | android:textColor="#000000" /> |
接下来写一个类继承LinearLayout,导入刚刚的布局,并且设置需要的方法,从而使的能在代码中控制这个自定义控件内容的显示。
01 | public class ImageBtn extends LinearLayout { |
03 | private ImageView imageView; |
04 | private TextView textView; |
06 | public ImageBtn(Context context) { |
10 | public ImageBtn(Context context, AttributeSet attrs) { |
11 | super(context, attrs); |
13 | LayoutInflater inflater=(LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); |
14 | inflater.inflate(R.layout.imagebtn, this); |
15 | imageView=(ImageView) findViewById(R.id.imageView1); |
16 | textView=(TextView)findViewById(R.id.textView1); |
22 | public void setImageResource(int resId) { |
23 | imageView.setImageResource(resId); |
29 | public void setTextViewText(String text) { |
30 | textView.setText(text); |
在需要使用这个自定义控件的layout中加入这控件,只需要在xml中加入即可。
01 | <?xml version="1.0" encoding="utf-8"?> |
02 | <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" |
03 | android:layout_width="fill_parent" |
04 | android:layout_height="fill_parent" |
05 | android:orientation="horizontal" > |
07 | <cn.com.karl.view.ImageBtn |
08 | android:id="@+id/btn_right" |
09 | android:layout_height="wrap_content" |
10 | android:layout_width="wrap_content" |
11 | android:background="@drawable/btn" |
14 | <cn.com.karl.view.ImageBtn |
15 | android:id="@+id/btn_error" |
16 | android:layout_marginLeft="5dp" |
17 | android:layout_height="wrap_content" |
18 | android:layout_width="wrap_content" |
19 | android:background="@drawable/btn" |
这里用到了背景图片 在drawable/btn.xml
1 | <?xml version="1.0" encoding="utf-8"?> |
2 | <selector xmlns:android="http://schemas.android.com/apk/res/android" > |
4 | <item android:state_focused="true" android:state_pressed="false"android:drawable="@drawable/btn_normal"></item> |
5 | <item android:state_pressed="true" android:drawable="@drawable/btn_white"></item> |
6 | <item android:state_checked="true" android:drawable="@drawable/btn_white"></item> |
7 | <item android:state_focused="false" android:state_pressed="false"android:drawable="@drawable/btn_normal"></item> |
最后在activity中设置该控件,和其他控件差不多:
01 | public class IdentifyButtonActivity extends Activity { |
02 | private ImageBtn imageBtn1; |
03 | private ImageBtn imageBtn2; |
05 | protected void onCreate(Bundle savedInstanceState) { |
07 | super.onCreate(savedInstanceState); |
08 | setContentView(R.layout.identifybutton); |
10 | imageBtn1=(ImageBtn) this.findViewById(R.id.btn_right); |
11 | imageBtn2=(ImageBtn) this.findViewById(R.id.btn_error); |
12 | imageBtn1.setTextViewText("确定"); |
13 | imageBtn2.setTextViewText("取消"); |
14 | imageBtn1.setImageResource(R.drawable.right_icon); |
15 | imageBtn2.setImageResource(R.drawable.error_icon); |
17 | imageBtn1.setOnClickListener(new View.OnClickListener() { |
19 | public void onClick(View v) { |
21 | Toast.makeText(getApplicationContext(), "点击的正确按钮", 1).show(); |
25 | imageBtn2.setOnClickListener(new View.OnClickListener() { |
27 | public void onClick(View v) { |
29 | Toast.makeText(getApplicationContext(), "点击的错误按钮", 1).show(); |
最后看看我们自定义控件的效果吧!
点击后还有按下按钮的效果。