我的活动包含多个EditText
和CheckBox
个es。其中一些是由用户动态添加的。我想要一个包含所有EditText
- 和CheckBox
- 对象的数组。
我在XML中使用LinearLayout,RelativeLayout和TableLayout。
我试过这个:
public void getAllEditTextsAndCheckBoxes(View view){
ArrayList<View> views = new ArrayList<View>();
for (int i = 0; i < this.mainScrollView.getFocusables(View.FOCUS_FORWARD).size(); i++) {
View actualView = mainScrollView.getFocusables(View.FOCUS_FORWARD).get(i);
if(actualView instanceof EditText) {
views.add((EditText) actualView);
}
if(actualView instanceof CheckBox) {
views.add((CheckBox) actualView);
}
}
}
但这只给了我EditText
而不是CheckBox
个<?xml version="1.0" encoding="utf-8"?>
<ScrollView>
<LinearLayout>
<!-- several LinearLayouts and Buttons-->
<RelativeLayout>
<TableLayout>
<TableRow>
</TableRow>
<TableRow>
<EditText/>
**<CheckBox/>**
</TableRow>
<TableRow>
<EditText/>
**<CheckBox/>**
</TableRow>
</TableLayout>
</RelativeLayout>
<!-- some other LinearLayouts and Buttons -->
</LinearLayout>
这是我凌乱的xml文件的结构:
http-server
(我试图忽略不重要的信息,但由于我不知道你需要多少,我不能做得很短:http://pastebin.com/DnQnxtVJ)
答案 0 :(得分:1)
您是否尝试过获取相关视图的所有子项并迭代它们?我自己从未使用getFocusables()
。也许复选框不可调焦,只能点击,因此它们不会出现?如果是这样,您可以尝试在创建对象时添加.setFocusable(true)
。
否则,我会这样做:
for(int i=0; i<((ViewGroup)ViewGroupToIterate).getChildCount(); i++) {
View nextChild = ((ViewGroup)ViewGroupToIterate).getChildAt(i);
if(nextChild instanceof EditText) {
views.add((EditText) actualView);
}
if(nextChild instanceof CheckBox) {
views.add((CheckBox) actualView);
}
}
答案 1 :(得分:1)
我已使用给定的布局测试了您的模块,并按预期返回结果。我创建了一个Fragment并将xml作为布局传递给它。片段一旦添加到活动中。我能够提取所有复选框和EditText视图。检查添加的日志。
@Override
public void onViewCreated(final View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
getAllEditTextsAndCheckBoxes(view);
}
public void getAllEditTextsAndCheckBoxes(View view){
ArrayList<View> returnViews = new ArrayList<View>();
ArrayList<View> focusableViews = view.getFocusables(View.FOCUS_FORWARD);
for (int i = 0; i < focusableViews.size(); i++) {
View actualView = focusableViews.get(i);
if(actualView instanceof EditText) {
returnViews.add((EditText) actualView);
}
if(actualView instanceof CheckBox) {
returnViews.add((CheckBox) actualView);
}
}
for(View mView: returnViews){
if (mView instanceof EditText){
Log.d("ash_sow", "EditText Found!!");
}
else if(mView instanceof CheckBox){
Log.d("ash_sow", "CheckBox Found!!");
}
}
}
所以我认为当您尝试在运行时添加组件时可能会发生这种情况,或者可能是其他问题。所以,再试一次,仔细看看可能的嫌疑人。