android 自訂RadioButton(選項按鈕)表徵圖隨便定.

來源:互聯網
上載者:User

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

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

      方法:運用群組控制項(ImageView and TextView)

    群組控制項代碼: 

/*** * 群組控制項 *  * @author zhangjia *  */public class RadioButton extends LinearLayout {private Context context;private ImageView imageView;private TextView textView;private int index = 0;private int id = 0;// 判斷是否選中private RadioButton tempRadioButton;// 模版用於儲存上次點擊的對象private int state[] = { R.drawable.radio_unchecked,R.drawable.radio_checked };/*** * 改變圖片 */public void ChageImage() {index++;id = index % 2;// 擷取圖片idimageView.setImageResource(state[id]);}/*** * 設定文本 *  * @param text */public void setText(String text) {textView.setText(text);}public String getText() {return id == 0 ? "" : textView.getText().toString();}public RadioButton(Context context) {this(context, null);}public RadioButton(Context context, AttributeSet attrs) {super(context, attrs);this.context = context;LayoutInflater.from(context).inflate(R.layout.item, this, true);imageView = (ImageView) findViewById(R.id.iv_item);textView = (TextView) findViewById(R.id.tv_item);}}

上面的實現的很容易,所以不過多解釋.

下面是調用代碼:

public class MainActivity extends Activity {ListView listView;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);listView = (ListView) findViewById(R.id.lv_main);listView.setAdapter(new MyAdapter(this));}/*** * @author jia */RadioButton temp;class MyAdapter extends BaseAdapter {private Context context;private LayoutInflater inflater;public MyAdapter(Context context) {super();this.context = context;inflater = LayoutInflater.from(context);}@Overridepublic int getCount() {return 10;}@Overridepublic Object getItem(int position) {return null;}@Overridepublic long getItemId(int position) {return 0;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {final RadioButton radioButton;if (convertView == null) {radioButton = new RadioButton(context);} else {radioButton = (RadioButton) convertView;}radioButton.setText(position + "");radioButton.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {// 模版不為空白,則chage.if (temp != null) {temp.ChageImage();}temp = radioButton;radioButton.ChageImage();Toast.makeText(context, radioButton.getText(), 1000).show();}});return radioButton;}}}

我來說明一下:我們首先建立一個temp模版,用於記憶你點擊的那個RadioButton對象.  在你點擊時候,首先查看temp是否為null,如果不為空白則執行 temp.ChageImage(); 這個方法是取消選中效果.如果不為null,則首先對該RadioButton執行,取消該按鈕選中狀態.在執行你點擊的那個RadioButton的ChageImage方法,最後記得要把當前的RadioButton付給temp.

 效果:

       

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

圖“:


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

final RadioButton radioButton;if (convertView == null) {radioButton = new RadioButton(context);} else {radioButton = (RadioButton) convertView;}

也許你會發現了,因為我們為了提高效率,重用了listview個convertView.所以會出現這種bug,解決方案也很簡單,只需要我們把上面代碼更換為

final RadioButton radioButton;radioButton = new RadioButton(context);

雖說這樣效率有點低,但是有時候我們需要則斷一下,只要能實現效果,偶爾對效能放下水也是OK的,何況這種情況下不可能有那麼多列.


 項目實現樣式:

            

    看起來還湊合吧。

這裡我把代碼上傳一下,不足的地方,自己可以進行調整,我只是提供個思路.

     源碼下載


額外拓展:

/*****************************************************************************/

LayoutInflater.from(context).inflate(R.layout.item, this);

View view=LayoutInflater.from(context).inflate(R.layout.item, null);

上面兩個方法想必大家在熟悉不過了,自訂View的時候離不開LayoutInflater這個東東,那麼有什麼區別呢,之前我一直不明白,包括寫這篇文章的時候,也是看了別人這麼搞,自己就比葫蘆畫瓢了.


public
View inflate(int Resourece,ViewGroup root)
作用:填充一個新的視圖階層從指定的XML資源檔中
reSource:View的layout的ID
root: 產生的階層的根視圖
return 填充的階層的根視圖。如果參數root提供了,那麼root就是根視圖;否則填充的XML檔案的根就是根視圖。


我簡單解釋下:當root為null的時候,我們只是把一個xml檔案執行個體化成View對象,反回的就是xml對應的View.而當root不為null的時候,也就是存在parent.那麼我們將把這個xml執行個體化程View對象後,將這個View視圖add進其parent中.所以在這裡我們用的是LayoutInflater.from(context).inflate(R.layout.item,
this);這樣其實就是把XML執行個體化後當作自己的一部分,這樣我們在調用此控制項的時候,顯示的就是我們想要的那個視圖了(XML視圖).說到這裡大家明白了.這樣以後用的時候再也不會糊塗了.如果想詳細瞭解那麼請參考這篇文章:View視圖架構源碼分析之一:android是如何建立一個view.講解的那是的相當的透徹,看懂後對於以後我們開發是百利而無一害啊.(*^__^*)
.

/*****************************************************************************/



第二種方法:對RadioButton給定樣式進行改造

看設定檔

seletor.xml  and style.xml 

<selector xmlns:android="http://schemas.android.com/apk/res/android">    <item android:drawable="@drawable/radio_checked" android:state_checked="true" android:state_enabled="true"></item>    <item android:drawable="@drawable/radio_unchecked" android:state_checked="false" android:state_enabled="true"></item></selector>
<resources xmlns:android="http://schemas.android.com/apk/res/android">    <style name="RadioButtonStyles">        <item name="android:button">@drawable/selector</item>    </style></resources>

最後只需要在RadioButton中引用即可.

    <RadioGroup        android:id="@+id/rg_main"        android:layout_width="match_parent"        android:layout_height="wrap_content" >        <RadioButton            android:id="@+id/button1"            style="@style/RadioButtonStyles"            android:layout_width="match_parent"            android:layout_height="wrap_content"            android:text="5K" />        <RadioButton            android:id="@+id/button2"            style="@style/RadioButtonStyles"            android:layout_width="match_parent"            android:layout_height="wrap_content"            android:text="10K" />    </RadioGroup>

這種方式很簡單吧,不過我覺的應用範圍沒有上面自訂來的廣,比如說上面我做的項目中,RadioButton中的text有兩項,這樣我們用RadioButton就無法實現了,遇到比較複雜的RadioButton選擇自訂是比較好的.

針對RadioButton 就說這麼多了,希望對你有協助.



相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.