将所有 CheckBox 分布在 Android 中的多个视图中

get all CheckBoxes spread over several views in Android

我的 activity 包含几个 EditTextCheckBox。其中一些是由用户动态添加的。我想要一个包含所有 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 文件的结构:

<?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>

(我试图省略不重要的信息,但由于我不知道你需要多少,所以我不能写得很短:http://pastebin.com/DnQnxtVJ

您是否尝试过获取相关视图的所有子视图并遍历它们?我自己从未使用过 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);
    }
}

我已经用给定的布局测试了你的模块,它返回了预期的结果。我创建了一个 Fragment 并传递了 xml 作为它的布局。一旦片段被添加到 activity。我能够提取所有复选框和 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!!");
            }
        }

    }

所以我认为这可能是您尝试在运行时添加组件时发生的,也可能是其他问题。所以再试一次,仔细看看可能的嫌疑人。