在视图中获取复选框状态

时间:2013-11-23 20:31:29

标签: java android checkbox

我有一个布局,用作视图的模板。这个视图正在多次生成,我想访问属于视图的一些复选框的值。

这是我的xml模板:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/motor_block"
android:layout_width="wrap_content"
android:layout_height="30dp"
android:orientation="horizontal" 
android:background="@drawable/motor_shape">

<TextView
    android:id="@+id/textView1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center_vertical|left"
    android:layout_margin="5dp"
    android:text="Motor" />

<CheckBox
    android:id="@+id/checkBox1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center_vertical"
    android:tag="A"
    android:text="A" />
   <CheckBox
    android:id="@+id/checkBox2"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center_vertical"
    android:tag="B"
    android:text="B" />
      <CheckBox
    android:id="@+id/checkBox3"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center_vertical"
    android:tag="C"
    android:text="C" />

<EditText
    android:id="@+id/editText1"
    android:layout_width="40dp"
    android:layout_height="wrap_content"
    android:layout_weight="1"
    android:ems="10"
    android:inputType="number"
    android:maxLength="2" >

    <requestFocus />
</EditText>

我无法获得状态

    CheckBox A = (CheckBox)findViewById(R.id.checkBox1);

因为它将获得生成的第一个视图的复选框的状态。

关于如何获得状态的任何想法?

修改

我定义了它:

    HashMap boxes = new HashMap();

然后我添加了CheckBox,并将视图作为键:

    boxes.put(iv,(CheckBox)findViewById(R.id.checkBox1));

但是当我这样做时:

    CheckBox A = boxes.get(v);

我明白了:类型不匹配:无法从Object转换为CheckBox

3 个答案:

答案 0 :(得分:0)

使自己成为包含所有复选框引用的ArrayList或HashMap,然后您可以稍后检查/取消选中它们。

ArrayList<CheckBox> boxes = new ArrayList<CheckBox>(); 

每次从布局创建视图时都可以

CheckBox A = (CheckBox)findViewById(R.id.checkBox1);
boxes.add(A);

您可以稍后再做

boxes.get(5).setChecked(true); 

您只需要考虑如何获得正确的索引,或者您可以使用HashMap并使用密钥。

答案 1 :(得分:0)

HashMap应与新代码中的泛型一起使用。它的设计是与不支持泛型的Java版本向后兼容,但这就是你应该如何创建一个新版本(这有解决你的投射问题的额外好处):

HashMap<Integer, CheckBox> map = new HashMap<Integer, CheckBox>();
map.put(1, (CheckBox)findViewById(R.id.checkBox1));
...
CheckBox a = map.get(1);

您还可以键入String或您需要的任何其他Object

注意@Ascorbin如何在他们的建议中使用泛型创建列表。

修改

解决你的意见:

首先,不要为每个复选框创建单独的地图;制作一张地图以容纳所有人:

HashMap<Integer, CheckBox> map = new HashMap<Integer, CheckBox>();
map.put(1, (CheckBox)findViewById(R.id.checkBox1));
map.put(2, (CheckBox)findViewById(R.id.checkBox2));
...
CheckBox a = map.get(1);
CheckBox b = map.get(2);

要处理多次实例化的视图,您有两个选项:

  1. 创建自己的自定义View子类,该子类内部包含其中一个映射,并保留对您创建的视图的每个实例的引用。然后,当您需要一个与特定视图绑定的特定复选框时,您可以执行以下操作:

    CheckBox a = myView.getCheckBoxMap().get(1);
    
  2. (更多自包含,但更糟糕的设计imo)在Activity中创建一个丑陋的数据结构,如下所示:

    HashMap<View, HashMap<Integer, CheckBox>> mainMap = new HashMap<View, HashMap<Integer, CheckBox>>();
    

    然后当你实例化视图时:

    View view1 = createFirstView();
    CheckBox a = (CheckBox)view1.findViewById(R.id.checkBox1);
    CheckBox b = (CheckBox)view1.findViewById(R.id.checkBox2);
    HashMap<Integer, CheckBox> view1Map = new HashMap<Integer, CheckBox>();
    view1Map.put(1, a);
    view1Map.put(2, b);
    mainMap.put(view1, view1Map);
    // rinse and repeat for every instantiated view, changing the variables each time - ie, view2/view2Map, etc.
    

答案 2 :(得分:0)

试试这个:

CheckBox A = (CheckBox)findViewById(R.id.checkBox1);
.
.
.
if(boxes.get(v).isChecked()){
    //do something
}
else{
    //do another thing
}