我有一个布局,用作视图的模板。这个视图正在多次生成,我想访问属于视图的一些复选框的值。
这是我的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
答案 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);
要处理多次实例化的视图,您有两个选项:
创建自己的自定义View
子类,该子类内部包含其中一个映射,并保留对您创建的视图的每个实例的引用。然后,当您需要一个与特定视图绑定的特定复选框时,您可以执行以下操作:
CheckBox a = myView.getCheckBoxMap().get(1);
(更多自包含,但更糟糕的设计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
}