自定义多行多列设置单选按钮

效果图





values里面设置的

<?xml version="1.0" encoding="utf-8"?>
<resources>
<!--多行多列 单项选择-->

<declare-styleable name="attrs_choice">
    <attr name="attr_rb1" format="string"/>
    <attr name="attr_rb2" format="string"/>
    <attr name="attr_rb3" format="string"/>
    <attr name="attr_rb4" format="string"/>
</declare-styleable>
</resources>



这是自定义控件

import android.content.Context;
import android.content.res.TypedArray;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.RadioButton;
import android.widget.RadioGroup;

import com.sj.yinjiaoyun.xuexi.R;

/**
 * Created by ${沈军 961784535@qq.com} on 2016/11/3.
 * 自定义 多行多列的 单项选则
 */
public class SingleChoiceView extends LinearLayout{

    RadioButton rb1;
    RadioButton rb2;
    RadioButton rb3;
    RadioButton rb4;
    RadioGroup gp1;
    RadioGroup gp2;
    Context context;
    public SingleChoiceView(Context context) {
        super(context);
        init(context);
    }

    public SingleChoiceView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init(context);
        getValues(attrs);
    }

    public SingleChoiceView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init(context);
        getValues(attrs);
    }

    //初始化控件
    private void init(Context context){
        this.context=context;
        View view= LayoutInflater.from(context).inflate(R.layout.view_major_direction,this);
        rb1= (RadioButton) view.findViewById(R.id.major_direction_rb1);
        rb2= (RadioButton) view.findViewById(R.id.major_direction_rb2);
        rb3= (RadioButton) view.findViewById(R.id.major_direction_rb3);
        rb4= (RadioButton) view.findViewById(R.id.major_direction_rb4);
        gp1= (RadioGroup) view.findViewById(R.id.major_direction_group1);
        gp2= (RadioGroup) view.findViewById(R.id.major_direction_group2);
        //为每个RadioButton设置监听器
        rb1.setOnClickListener(btnListener1);
        rb2.setOnClickListener(btnListener2);
        rb3.setOnClickListener(btnListener3);
        rb4.setOnClickListener(btnListener4);
    }

    BtnSelected btnListener1 = new BtnSelected("1");
    BtnSelected btnListener2 = new BtnSelected("2");
    BtnSelected btnListener3 = new BtnSelected("3");
    BtnSelected btnListener4 = new BtnSelected("4");

    private void getValues(AttributeSet attrs){
        TypedArray array=context.obtainStyledAttributes(attrs, R.styleable.attrs_choice);
        String str1=array.getString(R.styleable.attrs_choice_attr_rb1);
        rb1.setText(str1);
        String str2=array.getString(R.styleable.attrs_choice_attr_rb1);
        rb1.setText(str2);
        String str3=array.getString(R.styleable.attrs_choice_attr_rb1);
        rb1.setText(str3);
        String str4=array.getString(R.styleable.attrs_choice_attr_rb1);
        rb1.setText(str4);
        array.recycle();
    }

    /**
     *
     * @return  返回选中按钮的控件
     */
    public RadioButton getChoiceValues(){
        RadioButton rb=null;
        switch(strBtnSelected){
            case "1":
                rb=rb1;
                break;
            case "2":
                rb=rb2;
                break;
            case "3":
                rb=rb3;
                break;
            case "4":
                rb=rb4;
                break;
        }
        return rb;
    }

    /**
     *
     * @param stnSelected   数字对应的按钮控件
     * @param values       给这个控件设置的值
     */
    public void setChoiceValues(int stnSelected,String values){
        switch(stnSelected){
            case 1:
                rb1.setText(values);
                break;
            case 2:
                rb2.setText(values);
                break;
            case 3:
                rb3.setText(values);
                break;
            case 4:
                rb4.setText(values);
                break;
        }
    }

    //用于保存当前被选中的按钮
    String strBtnSelected = "unInit";
    //监听类,每个Radiobutton均对Click动作进行监听:若用户点击的是Group1的按钮(A或B或C),则清除Group2中按钮被选中的状态
    //若用户点击的是Gourp2的按钮(B或C或D),则清除Group1中按钮被选中的状态。其中的1~6分别对应按钮A~F
    class BtnSelected implements OnClickListener {
        public BtnSelected(String str) {
            bntID = str;
        }
        final public String bntID;
        @Override
        public void onClick(View arg0) {
            // TODO Auto-generated method stub
            strBtnSelected = bntID;
            if (bntID.equals("1") || bntID.equals("2")) {
                gp2.clearCheck();
            } else if (bntID.equals("3") || bntID.equals("4") ) {
                gp1.clearCheck();
            }
        }
    };
}
 

布局中使用

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:hint="首页"/>
    
    <com.sj.yinjiaoyun.xuexi.view.SingleChoiceView
        android:id="@+id/SingleChoice"
        app:attr_rb1="java"
        app:attr_rb3="ios布局设置的值"
        app:attr_rb4="android"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

    <!--确认选择-->
     <Button
         android:onClick="onclick"
         android:id="@+id/major_direction_sure"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:layout_gravity="center_horizontal"
         android:paddingTop="10dp"
         android:paddingBottom="10dp"
         android:paddingLeft="30dp"
         android:paddingRight="30dp"
         android:hint="确认选择"/>

</LinearLayout>

Activity或者Fragment代码中使用

public class HomeFragment extends Fragment {

    String TAG="homefragment";
    SingleChoiceView single;
    Button btn;
    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view =inflater.inflate(R.layout.fragment_home,container,false);
        initView(view);
        return view;
    }

    private void initView(View view) {
        single= (SingleChoiceView) view.findViewById(R.id.SingleChoice);
        btn= (Button) view.findViewById(R.id.major_direction_sure);
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Log.i(TAG, "onclick: ");
                RadioButton rb=single.getChoiceValues();
                Log.i(TAG, "onclick: "+rb.getText().toString());
            }
        });
        single.setChoiceValues(2,"web这是代码中设置的值");
        single.setChoiceValues(3,"ios这是代码中设置的值");
    }
}

效果图




最后log答应出来的截图





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值