Android RadioGroup显示多行的RadioButton,可点击单选!!!

说明:一开始也是要用RadioGroup来添加单选按钮,但是想分成两行,原先想的办法是用一个RadioGroup内部嵌套两个LinearLayout,在添加RadioButton,但是发现在添加

setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener()

监听器时候发现没效果了,百度其他大佬的文章也是不太好实现,之后我改成两个RadioGroup去实现,发先独自的一行可以实现了,但是出现了两个选项被选中的状态,后来百度说可以在点击其中一个Group的Button的时候用clearCheck()去清除另一个Group的选中状态,但是发现在监听器里面这个会报错StackOveflowError错误,实在难受,之后我用了一个最简单的办法,代码在下面,边讲解边看代码

 

先上效果图:

 

接下来就是代码

下面是XML的布局代码

(一些样式的设置就不给出来了,大体实现这个功能的代码在)

<RadioGroup
    android:id="@+id/radiogroup_equip_one"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
    android:gravity="center"
    android:layout_marginTop="10dp">

    <RadioButton
        android:id="@+id/radiobtn_arms"
        android:layout_width="40dp"
        android:layout_height="25sp"
        android:text="武 器"
        android:textSize="13sp"
        android:textColor="@color/text_lavender_yellow"
        android:checked="true"
        android:button="@null"
        android:gravity="center"
        android:background="@drawable/imageview_chapter_btn"
        />
    <RadioButton
        android:id="@+id/radiobtn_clothes"
        android:layout_width="40dp"
        android:layout_height="25sp"
        android:text="衣 服"
        android:textSize="13sp"
        android:textColor="@color/text_lavender_yellow"
        android:button="@null"
        android:gravity="center"
        android:background="@drawable/imageview_chapter_btn"
        android:layout_marginLeft="25dp"
        />
    <RadioButton
        android:id="@+id/radiobtn_trousers"
        android:layout_width="40dp"
        android:layout_height="25sp"
        android:text="裤 子"
        android:textSize="13sp"
        android:textColor="@color/text_lavender_yellow"
        android:button="@null"
        android:gravity="center"
        android:background="@drawable/imageview_chapter_btn"
        android:layout_marginLeft="25dp"
        />
    <RadioButton
        android:id="@+id/radiobtn_title"
        android:layout_width="40dp"
        android:layout_height="25sp"
        android:text="称 号"
        android:textSize="13sp"
        android:textColor="@color/text_lavender_yellow"
        android:button="@null"
        android:gravity="center"
        android:background="@drawable/imageview_chapter_btn"
        android:layout_marginLeft="25dp"
        />
</RadioGroup>
<RadioGroup
    android:id="@+id/radiogroup_equip_two"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
    android:gravity="center"
    android:layout_marginTop="5dp"
    android:layout_marginBottom="10dp">

    <RadioButton
        android:id="@+id/radiobtn_necklace"
        android:layout_width="40dp"
        android:layout_height="25sp"
        android:text="项 链"
        android:textSize="13sp"
        android:textColor="@color/text_lavender_yellow"
        android:button="@null"
        android:gravity="center"
        android:background="@drawable/imageview_chapter_btn"
        />
    <RadioButton
        android:id="@+id/radiobtn_ring"
        android:layout_width="40dp"
        android:layout_height="25sp"
        android:text="戒 指"
        android:textSize="13sp"
        android:textColor="@color/text_lavender_yellow"
        android:button="@null"
        android:gravity="center"
        android:background="@drawable/imageview_chapter_btn"
        android:layout_marginLeft="25dp"
        />
    <RadioButton
        android:id="@+id/radiobtn_bracelet"
        android:layout_width="40dp"
        android:layout_height="25sp"
        android:text="手 镯"
        android:textSize="13sp"
        android:textColor="@color/text_lavender_yellow"
        android:button="@null"
        android:gravity="center"
        android:background="@drawable/imageview_chapter_btn"
        android:layout_marginLeft="25dp"
        />
    <RadioButton
        android:id="@+id/radiobtn_horcruxes"
        android:layout_width="40dp"
        android:layout_height="25sp"
        android:text="魂 器"
        android:textSize="13sp"
        android:textColor="@color/text_lavender_yellow"
        android:button="@null"
        android:gravity="center"
        android:background="@drawable/imageview_chapter_btn"
        android:layout_marginLeft="25dp"
        />
</RadioGroup>

 

Activity的java代码

radiogroup_equip_one = findViewById(R.id.radiogroup_equip_one);//这个两个是RadioGroup
radiogroup_equip_two = findViewById(R.id.radiogroup_equip_two);
radiobtn_arms = findViewById(R.id.radiobtn_arms);//这下面是RadioButton
radiobtn_clothes = findViewById(R.id.radiobtn_clothes);
radiobtn_trousers = findViewById(R.id.radiobtn_trousers);
radiobtn_title = findViewById(R.id.radiobtn_title);
radiobtn_necklace = findViewById(R.id.radiobtn_necklace);
radiobtn_ring = findViewById(R.id.radiobtn_ring);
radiobtn_bracelet = findViewById(R.id.radiobtn_bracelet);
radiobtn_horcruxes = findViewById(R.id.radiobtn_horcruxes);
lay_bag_show_equip = findViewById(R.id.lay_bag_show_equip);
btn_order_splitting = findViewById(R.id.btn_order_splitting);
isSelectOne = true;//重点就是这个
radiogroup_equip_one.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
    @Override
    public void onCheckedChanged(RadioGroup group, int checkedId) {
        //消除第二行选中状态
        if(isSelectOne == false){//判断之前选中是第二行也就是false,这时候对第一行进行操作
            radiobtn_necklace.setChecked(false);//这四个是第二行的RadioButton
            radiobtn_ring.setChecked(false);
            radiobtn_bracelet.setChecked(false);
            radiobtn_horcruxes.setChecked(false);
            RadioButton radioButton_equip = radiogroup_equip_one.findViewById(checkedId);
            String radiobutton_name = radioButton_equip.getText().toString();
            if(radiobutton_name.equals(radiobtn_arms.getText().toString())){//下面是对选中的RadioButton进行选中
                radiobtn_arms.setChecked(true);
            }else if (radiobutton_name.equals(radiobtn_clothes.getText().toString())){
                radiobtn_clothes.setChecked(true);
            }else if (radiobutton_name.equals(radiobtn_trousers.getText().toString())){
                radiobtn_trousers.setChecked(true);
            }else if (radiobutton_name.equals(radiobtn_title.getText().toString())){
                radiobtn_title.setChecked(true);
            }
            isSelectOne = true;
        }
    }
});
radiogroup_equip_two.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
    @Override
    public void onCheckedChanged(RadioGroup group, int checkedId) {
        //清除第一行选中状态
        if(isSelectOne == true){//判断之前选中是第一行也就是true,这时候对第二行进行操作
            radiobtn_arms.setChecked(false);//下面四个是第一行的RadioButton
            radiobtn_clothes.setChecked(false);
            radiobtn_trousers.setChecked(false);
            radiobtn_title.setChecked(false);
            RadioButton radioButton_equip = radiogroup_equip_two.findViewById(checkedId);
            String radiobutton_name = radioButton_equip.getText().toString();
            if (radiobutton_name.equals(radiobtn_necklace.getText().toString())){//下面是对选中的RadioButton进行选中
                radiobtn_necklace.setChecked(true);
            }else if (radiobutton_name.equals(radiobtn_ring.getText().toString())){
                radiobtn_ring.setChecked(true);
            }else if (radiobutton_name.equals(radiobtn_bracelet.getText().toString())){
                radiobtn_bracelet.setChecked(true);
            }else if (radiobutton_name.equals(radiobtn_horcruxes.getText().toString())){
                radiobtn_horcruxes.setChecked(true);
            }
            isSelectOne = false;
        }
    }
});

讲解解决原理

这里是自己的理解,如果有异议可以评论指出,首先如果没有 isSelectOne 这个判断的话,直接进行选中事件监听器的操作,其中在第一个RadioGroup里面有对第二个的RadioButton的设置操作,就是那修改四个的选中状态,这里一但修改了第二个RadioButton,就会触发第二个的监听器,所以就会执行第二个里面的操作,其中却反过来对第一个进行选中修改为false,这就矛盾了,所以添加一个全局的boolean变量来进行判断,就可以避免,最后实现结果,如果要实现多行的RadioGroup,一样加判断就行,就是代码量会多,我看网上也有直接重写RadioGroup的也可以,主要看大家程序适合哪个了。

 

最后

这是第一次写CSDN文章,布局和讲解怪怪的,希望大家不要建议,有对我的代码不懂的可以在评论区留言,我有空就会回你们的,感谢能看到这里的朋友们,大家一起努力啦!!!

 

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值