2013-12-18 11:25:22
轉載自: http://www.open-open.com/lib/view/open1328836804515.html
很多時候android常用的控件不能滿足我們的需求,那么我們就需要自定義一個控件了。今天做了一個自定義控件的實例,來分享下。
首先定義一個layout實現按鈕內部布局:
1 <?xml version="1.0" encoding="utf-8"?> 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 android:layout_width="fill_parent" 4 android:layout_height="fill_parent" 5 android:orientation="horizontal" > 6 7 <ImageView 8 android:id="@+id/imageView1" 9 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" /> 16 17 <TextView 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" 23 android:text="確定" 24 android:textColor="#000000" /> 25 26 </LinearLayout>
接下來寫一個類繼承LinearLayout,導入剛剛的布局,並且設置需要的方法,從而使的能在代碼中控制這個自定義控件內容的顯示。
1 public class ImageBtn extends LinearLayout { 2 3 private ImageView imageView; 4 private TextView textView; 5 6 public ImageBtn(Context context) { 7 super(context); 8 // TODO Auto-generated constructor stub 9 } 10 public ImageBtn(Context context, AttributeSet attrs) { 11 super(context, attrs); 12 // TODO Auto-generated constructor stub 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); 17 } 18 19 /** 20 * 設置圖片資源 21 */ 22 public void setImageResource(int resId) { 23 imageView.setImageResource(resId); 24 } 25 26 /** 27 * 設置顯示的文字 28 */ 29 public void setTextViewText(String text) { 30 textView.setText(text); 31 } 32 33 }
在需要使用這個自定義控件的layout中加入這控件,只需要在xml中加入即可。
1 <?xml version="1.0" encoding="utf-8"?> 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 android:layout_width="fill_parent" 4 android:layout_height="fill_parent" 5 android:orientation="horizontal" > 6 7 <cn.com.karl.view.ImageBtn 8 android:id="@+id/btn_right" 9 android:layout_height="wrap_content" 10 android:layout_width="wrap_content" 11 android:background="@drawable/btn" 12 /> 13 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" 20 /> 21 22 </LinearLayout>
這里用到了背景圖片 在drawable/btn.xml:
1 <?xml version="1.0" encoding="utf-8"?> 2 <selector xmlns:android="http://schemas.android.com/apk/res/android" > 3 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> 8 9 </selector>
最后在activity中設置該控件,和其他控件差不多:
1 public class IdentifyButtonActivity extends Activity { 2 private ImageBtn imageBtn1; 3 private ImageBtn imageBtn2; 4 @Override 5 protected void onCreate(Bundle savedInstanceState) { 6 // TODO Auto-generated method stub 7 super.onCreate(savedInstanceState); 8 setContentView(R.layout.identifybutton); 9 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); 16 17 imageBtn1.setOnClickListener(new View.OnClickListener() { 18 19 public void onClick(View v) { 20 // TODO Auto-generated method stub 21 Toast.makeText(getApplicationContext(), "點擊的正確按鈕", 1).show(); 22 } 23 }); 24 25 imageBtn2.setOnClickListener(new View.OnClickListener() { 26 27 public void onClick(View v) { 28 // TODO Auto-generated method stub 29 Toast.makeText(getApplicationContext(), "點擊的錯誤按鈕", 1).show(); 30 } 31 }); 32 } 33 }
最后看看我們自定義控件的效果吧!
點擊后還有按下按鈕的效果。