将所有 CheckBox 分布在 Android 中的多个视图中
get all CheckBoxes spread over several views in Android
我的 activity 包含几个 EditText
和 CheckBox
。其中一些是由用户动态添加的。我想要一个包含所有 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!!");
}
}
}
所以我认为这可能是您尝试在运行时添加组件时发生的,也可能是其他问题。所以再试一次,仔细看看可能的嫌疑人。
我的 activity 包含几个 EditText
和 CheckBox
。其中一些是由用户动态添加的。我想要一个包含所有 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!!");
}
}
}
所以我认为这可能是您尝试在运行时添加组件时发生的,也可能是其他问题。所以再试一次,仔细看看可能的嫌疑人。