歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Android 自定義RadioButton(單選按鈕)圖標隨便定

RadioButton在我們開發APP應用中是很常見的.這點我不用說大家也心知肚明. 

雖說Android 系統給我們提供了RadioButton但是為了我們的應用有種"與眾不同"的效果,因為android的太死板太斯通見慣了.往往都會定制自己的圖標.下面我給大家介紹一下我實現的方法:

方法:運用組合控件(ImageView and TextView)

組合控件代碼: 

  1. /*** 
  2.  * 組合控件 
  3.  *  
  4.  * @author zhangjia 
  5.  *  
  6.  */  
  7. public class RadioButton extends LinearLayout {  
  8.     private Context context;  
  9.     private ImageView imageView;  
  10.     private TextView textView;  
  11.   
  12.     private int index = 0;  
  13.     private int id = 0;// 判斷是否選中   
  14.   
  15.     private RadioButton tempRadioButton;// 模版用於保存上次點擊的對象   
  16.   
  17.     private int state[] = { R.drawable.radio_unchecked,  
  18.             R.drawable.radio_checked };  
  19.   
  20.   
  21.     /*** 
  22.      * 改變圖片 
  23.      */  
  24.     public void ChageImage() {  
  25.   
  26.         index++;  
  27.         id = index % 2;// 獲取圖片id   
  28.         imageView.setImageResource(state[id]);  
  29.     }  
  30.   
  31.     /*** 
  32.      * 設置文本 
  33.      *  
  34.      * @param text 
  35.      */  
  36.     public void setText(String text) {  
  37.         textView.setText(text);  
  38.     }  
  39.   
  40.     public String getText() {  
  41.         return id == 0 ? "" : textView.getText().toString();  
  42.   
  43.     }  
  44.   
  45.     public RadioButton(Context context) {  
  46.         this(context, null);  
  47.   
  48.     }  
  49.   
  50.     public RadioButton(Context context, AttributeSet attrs) {  
  51.         super(context, attrs);  
  52.         this.context = context;  
  53.         LayoutInflater.from(context).inflate(R.layout.item, thistrue);  
  54.         imageView = (ImageView) findViewById(R.id.iv_item);  
  55.         textView = (TextView) findViewById(R.id.tv_item);  
  56.   
  57.     }  
  58.   
  59. }  
上面的實現的很容易,所以不過多解釋.

下面是調用代碼:

  1. public class MainActivity extends Activity {  
  2.     ListView listView;  
  3.   
  4.     @Override  
  5.     public void onCreate(Bundle savedInstanceState) {  
  6.         super.onCreate(savedInstanceState);  
  7.         setContentView(R.layout.main);  
  8.         listView = (ListView) findViewById(R.id.lv_main);  
  9.         listView.setAdapter(new MyAdapter(this));  
  10.     }  
  11.   
  12.     /*** 
  13.      * @author jia 
  14.      */  
  15.     RadioButton temp;  
  16.   
  17.     class MyAdapter extends BaseAdapter {  
  18.         private Context context;  
  19.         private LayoutInflater inflater;  
  20.   
  21.         public MyAdapter(Context context) {  
  22.             super();  
  23.             this.context = context;  
  24.             inflater = LayoutInflater.from(context);  
  25.         }  
  26.   
  27.         @Override  
  28.         public int getCount() {  
  29.             return 10;  
  30.         }  
  31.   
  32.         @Override  
  33.         public Object getItem(int position) {  
  34.             return null;  
  35.         }  
  36.   
  37.         @Override  
  38.         public long getItemId(int position) {  
  39.             return 0;  
  40.         }  
  41.   
  42.         @Override  
  43.         public View getView(int position, View convertView, ViewGroup parent) {  
  44.             final RadioButton radioButton;  
  45.             if (convertView == null) {  
  46.                 radioButton = new RadioButton(context);  
  47.             } else {  
  48.                 radioButton = (RadioButton) convertView;  
  49.             }  
  50.   
  51.             radioButton.setText(position + "");  
  52.   
  53.             radioButton.setOnClickListener(new OnClickListener() {  
  54.                 @Override  
  55.                 public void onClick(View v) {  
  56.                     // 模版不為空,則chage.   
  57.                     if (temp != null) {  
  58.                         temp.ChageImage();  
  59.                     }  
  60.                     temp = radioButton;  
  61.                     radioButton.ChageImage();  
  62.   
  63.                     Toast.makeText(context, radioButton.getText(), 1000).show();  
  64.   
  65.                 }  
  66.             });  
  67.   
  68.             return radioButton;  
  69.         }  
  70.     }  
  71. }  
我來說明一下:我們首先創建一個temp模版,用於記憶你點擊的那個RadioButton對象.  在你點擊時候,首先查看temp是否為null,如果不為空則執行 temp.ChageImage(); 這個方法是取消選中效果.如果不為null,則首先對該RadioButton執行,取消該按鈕選中狀態.在執行你點擊的那個RadioButton的ChageImage方法,最後記得要把當前的RadioButton付給temp.

 效果:

    

效果是實現了,不過有個小問題,因為目前只有10條數據是看不出效果的.換成20條你就會發現很詭異的問題。

圖“:


第15條數據會自動勾選上,找了又找,最後終於發現了,是因為listview 的問題。看下面:

  1. final RadioButton radioButton;  
  2.             if (convertView == null) {  
  3.                 radioButton = new RadioButton(context);  
  4.             } else {  
  5.                 radioButton = (RadioButton) convertView;  
  6.             }  
Copyright © Linux教程網 All Rights Reserved