1. 程式人生 > >Android 動態設定RadioButton選中和沒選中的顏色及設定預設選中某一項

Android 動態設定RadioButton選中和沒選中的顏色及設定預設選中某一項

關於RadioButton動態設定背景顏色和字型顏色,踩過好多坑,接下來我總結一下遇到的所有問題及解決方案,供大家參考下,希望對大家有幫助。

1.首先,我們先來寫radiobutton選中和未選中的背景顏色的xml檔案。

在drawable資料夾下新建一個檔案:button_bg.xml
程式碼如下:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" >
    <item android:state_checked
="true" android:drawable="@drawable/button_selected" >
</item> <item android:state_checked="false" android:drawable="@drawable/button_unselected"></item> </selector>

選中的背景顏色和未選中的背景顏色的drawable檔案分別如下:
button_selected.xml程式碼如下:

<?xml version="1.0" encoding="utf-8"?>
<shape
xmlns:android="http://schemas.android.com/apk/res/android">
<!-- 填充 --> <solid android:color="@color/red" /> <!-- 圓角 --> <corners android:radius="5dp" /> </shape>

button_unselected.xml程式碼如下:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android
="http://schemas.android.com/apk/res/android">
<!-- 填充 --> <solid android:color="@color/white" /> <stroke android:color="@color/red" android:width="1px"/> <!-- 圓角 --> <corners android:radius="5dp" /> </shape>

2.接下來我們就寫radiobutton選中和未選中的字型顏色的xml檔案。

注意,這裡就要踩坑了,網上很多的寫法跟設定背景顏色的寫法一樣,可以寫出來發現,背景顏色對應變化了,可是字型顏色並沒有對應發生變化,試了好多次,終於找到了正確的辦法。
我們在Activity程式碼中設定背景顏色和字型顏色時可以發現,設定背景顏色可以直接用drawable資料夾下的資原始檔:button.setBackgroundResource(R.drawable.button_bg);而設定字型顏色時,不能用R.drawable… 只能用R.color….於是,我們需要在value資料夾下新建一個color資料夾,然後在color資料夾下新建一個button_txt_color.xml資原始檔,表示選擇和未選中的字型顏色:
程式碼如下:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" >
    <item android:color="#ffffff" android:state_checked="true"></item> 
    <item android:color="#f00" android:state_checked="false"></item>  
</selector>  

這樣資原始檔這些就寫好了,接下來就是Activity中的程式碼了:

3.在程式碼中設定RadioButton的背景顏色和字型顏色,並設定預設選中項。

這裡就直接上程式碼了,都能看懂,也有註釋。

public class MainActivity extends AppCompatActivity {

    private RadioGroup mAllLayout;
    private List<String> data;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        data = new ArrayList<>();
        data.add("近視眼鏡");
        data.add("太陽眼鏡");
        data.add("功能眼鏡");
        data.add("隱形眼鏡");
        data.add("男款眼鏡");
        data.add("女款眼鏡");
        data.add("品牌眼鏡");
        initView();
    }

    private void initView() {
        mAllLayout = (RadioGroup) findViewById(R.id.all_layout);
        for (int i = 0; i < data.size(); i++) {
            RadioButton button = new RadioButton(this);
            button.setBackgroundResource(R.drawable.button_bg);
            button.setTextColor(getResources().getColorStateList(R.color.button_txt_color));

            //這裡給每個button設定Id,後面才能用mAllLayout.check(0);來設定預設選中項
            button.setId(i);  

            //設定不要單選按鈕前面的小圓圈
            Bitmap a=null;
            button.setButtonDrawable(new BitmapDrawable(a));
            //設定字型加粗
            TextPaint tp = button.getPaint();
            tp.setFakeBoldText(true);

            button.setPadding(20,10,20,10);
            RadioGroup.LayoutParams params = new RadioGroup.LayoutParams(
                    ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
            params.setMargins(10,10,10,10);
            mAllLayout.addView(button, params);
        }
        mAllLayout.check(0);
    }
}

這裡就要注意了,一般都會以為設定預設選中項用button.setChecked(true);來實現,這樣是達不到效果的,所以還是需要使用radioGroup.check(0)來設定,當前前提也必須要有button.setId(i); 這句程式碼。

好了,總結的差不多了,希望能幫助到跟我一樣踩坑的朋友們,如果幫助到你,記得頂一個哦,如果有更好方法的,也希望朋友們在下面回覆一下,畢竟我的技術還有限,也希望跟大家多學習學習。。