【问题标题】:Force dynamically generated checkboxes to allow only one to be selected强制动态生成的复选框只允许选择一个
【发布时间】:2013-02-26 21:29:32
【问题描述】:

我正在动态生成一系列复选框。

我可以从中选中任何一个复选框:

单击另一个复选框时如何取消选中已选中的复选框?

编辑

在这里我添加了我的 RadioGroup 实现,我得到了 IllegalStateException 最终线性布局 firstRowTxtLayout = new LinearLayout(fContext); firstRowTxtLayout.setLayoutParams(新的 LinearLayout.LayoutParams( LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT));

    rbGroup.setLayoutParams(new LinearLayout.LayoutParams(
            LinearLayout.LayoutParams.WRAP_CONTENT,
            LinearLayout.LayoutParams.WRAP_CONTENT));
    rbButton = new RadioButton(fContext);
    rbButton.setLayoutParams(new LinearLayout.LayoutParams(
            LinearLayout.LayoutParams.WRAP_CONTENT,
            LinearLayout.LayoutParams.WRAP_CONTENT));
    rbButton.setId(rbTagincreament);
    rbGroup.addView(rbButton);

然后我将此 radioGroup 添加到另一个主要线性布局中

firstRowTxtLayout.addView(rbGroup); here i am getting the exception

【问题讨论】:

  • 使用RadioGroup,因为它只提供一个检查选项!
  • 实际上我的要求只是复选框,在这里我以编程方式创建所有内容,而不使用任何 xml,它是跨平台的东西。
  • 您的要求可能是它看起来像一个复选框。没有什么能阻止单选按钮看起来像复选框。

标签: android checkbox


【解决方案1】:

我将 RadioGroup 与自定义 RadioButton 一起使用,但我将 RadioButton 更改为 Checkbox。它的行为仅类似于 RadioButton,即只有单个选择。

main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <LinearLayout
        android:id="@+id/linearlayout"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" >
    </LinearLayout>

</LinearLayout>

MainActivity.java

@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        LinearLayout linear=(LinearLayout) findViewById(R.id.linearlayout);

        final RadioButton[] rb = new RadioButton[5];
        RadioGroup rg = new RadioGroup(this); //create the RadioGroup
        rg.setOrientation(RadioGroup.VERTICAL);//or RadioGroup.VERTICAL
        for(int i=0; i<5; i++){
            rb[i]  = new RadioButton(this);
            rb[i].setButtonDrawable(R.drawable.single_radio_chice);
            rg.addView(rb[i]); 

        }
        LinearLayout.LayoutParams p = new LinearLayout.LayoutParams(
                LinearLayout.LayoutParams.FILL_PARENT,
                LinearLayout.LayoutParams.WRAP_CONTENT
        );
        p.setMargins(10, 10, 10, 10);
        linear.addView(rg,p);

    }

选择器

single_radio_chice

<?xml version="1.0" encoding="utf-8"?>
    <selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:state_checked="false" 
        android:drawable="@drawable/check_off" />

    <item android:state_checked="true" 
        android:drawable="@drawable/check_on" />
</selector>

希望这会对你有所帮助。

【讨论】:

  • 嗨,现在我已经使用 RadioGroup 来实现它,现在我得到 03-11 23:12:24.939: W/System.err(475): java.lang.IllegalStateException: The specified child has a父母。您必须先在孩子的父母上调用 removeView()。
  • @Kris 能否请您发布出现此错误的代码?
  • yes.. 我在这里将我的 RadioGroup 添加到另一个线性布局 firstRowTxtLayout.addView(rbGroup);
  • 在上面第 m 行得到异常
  • @kris 在 firstRowTxtLayout.addView(rbGroup);写这个 if(firstRowTxtLayout.getChildCount() > 0) firstRowTxtLayout.removeAllViews();
【解决方案2】:

获取不同变量中所有复选框的引用。

satView.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {

   @Override
   public void onCheckedChanged(CompoundButton buttonView,boolean isChecked) {
          if(isChecked) {
            checkBox.setChecked(false); //Here call this method on all checkbox except you want to check single checkbox.
        }
   }
}

但更好的方法是使用RadioGroupRadioButton,因为单选按钮允许用户从一组选项中选择一个选项。 阅读here

【讨论】:

  • 我同意 RadioGroup 并且我也尝试过。我的代码有点不同,就像我在没有任何 xml 的情况下所做的那样。与 List getView 我显示我所有的观点。当我使用带有 Layout 的 RadioGroup 时,m gettin g java.lang.IllegalStateException: The specified child already has a parent。您必须先在孩子的父母上调用 removeView()。
【解决方案3】:

将所有动态创建的RadioButtons 放入数组中。当您检查其中一个时,请检查所有其他和setChecked(false);

如前所述,RadioGroup 也可以是一个解决方案。但由于某种原因,如果您想在 RadioButtons 之间放置其他对象,例如 ImageViewsTextView,我发现它很难使用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-09
    • 2012-10-27
    • 1970-01-01
    • 1970-01-01
    • 2012-05-19
    相关资源
    最近更新 更多