一次获取 LinearLayout 中的所有子视图
Posted
技术标签:
【中文标题】一次获取 LinearLayout 中的所有子视图【英文标题】:Get all child views inside LinearLayout at once 【发布时间】:2011-12-08 17:22:20 【问题描述】:我有一个LinearLayout
,其中包含几个孩子TextViews
。如何使用循环获取该 LinerLayout 的子视图?
【问题讨论】:
【参考方案1】:使用getChildCount()
和getChildAt(int index)
。
示例:
LinearLayout ll = …
final int childCount = ll.getChildCount();
for (int i = 0; i < childCount; i++)
View v = ll.getChildAt(i);
// Do something with v.
// …
【讨论】:
嗨 Yashwanth Kumar,我可以在 Linearlayout 中获取所有 TextView 吗? @hai-nguyen:你可以使用 if (v instanceof TextView) ... 。 如果其中一个孩子是 ViewGroup 并且我们也想获取所有这些孩子怎么办? 我怎样才能得到在线性布局中添加的buttons
的总数并将其除以 2 ?我的目的是使用 linear layout 显示 2 行按钮。【参考方案2】:
((ViewGroup) findViewById(android.R.id.content));// you can use this in an Activity to get your layout root view, then pass it to findAllEdittexts() method below.
这里我只迭代 EdiText,如果你想要所有的 View,你可以用 View 替换 EditText。
SparseArray<EditText> array = new SparseArray<EditText>();
private void findAllEdittexts(ViewGroup viewGroup)
int count = viewGroup.getChildCount();
for (int i = 0; i < count; i++)
View view = viewGroup.getChildAt(i);
if (view instanceof ViewGroup)
findAllEdittexts((ViewGroup) view);
else if (view instanceof EditText)
EditText edittext = (EditText) view;
array.put(editText.getId(), editText);
【讨论】:
澄清一下,递归是因为getChildAt
只返回直接子节点
递归调用“too”会不会导致***错误?【参考方案3】:
使用这个
final int childCount = mainL.getChildCount();
for (int i = 0; i < childCount; i++)
View element = mainL.getChildAt(i);
// EditText
if (element instanceof EditText)
EditText editText = (EditText)element;
System.out.println("ELEMENTS EditText getId=>"+editText.getId()+ " getTag=>"+element.getTag()+
" getText=>"+editText.getText());
// CheckBox
if (element instanceof CheckBox)
CheckBox checkBox = (CheckBox)element;
System.out.println("ELEMENTS CheckBox getId=>"+checkBox.getId()+ " getTag=>"+checkBox.getTag()+
" getText=>"+checkBox.getText()+" isChecked=>"+checkBox.isChecked());
// DatePicker
if (element instanceof DatePicker)
DatePicker datePicker = (DatePicker)element;
System.out.println("ELEMENTS DatePicker getId=>"+datePicker.getId()+ " getTag=>"+datePicker.getTag()+
" getDayOfMonth=>"+datePicker.getDayOfMonth());
// Spinner
if (element instanceof Spinner)
Spinner spinner = (Spinner)element;
System.out.println("ELEMENTS Spinner getId=>"+spinner.getId()+ " getTag=>"+spinner.getTag()+
" getSelectedItemId=>"+spinner.getSelectedItemId()+
" getSelectedItemPosition=>"+spinner.getSelectedItemPosition()+
" getTag(key)=>"+spinner.getTag(spinner.getSelectedItemPosition()));
【讨论】:
【参考方案4】:在 Kotlin 中使用 for-in 循环更容易:
for (childView in ll.children)
//childView is a child of ll
这里的ll
是在布局XML 中定义的LinearLayout
中的id
。
【讨论】:
【参考方案5】:从任何类型的布局中获取所有视图
public List<View> getAllViews(ViewGroup layout)
List<View> views = new ArrayList<>();
for(int i =0; i< layout.getChildCount(); i++)
views.add(layout.getChildAt(i));
return views;
从任何类型的布局中获取所有TextView
public List<TextView> getAllTextViews(ViewGroup layout)
List<TextView> views = new ArrayList<>();
for(int i =0; i< layout.getChildCount(); i++)
View v =layout.getChildAt(i);
if(v instanceof TextView)
views.add((TextView)v);
return views;
【讨论】:
【参考方案6】:在 Kotlin 中递归获取视图及其子视图的所有视图:
private fun View.getAllViews(): List<View>
if (this !is ViewGroup || childCount == 0) return listOf(this)
return children
.toList()
.flatMap it.getAllViews()
.plus(this as View)
【讨论】:
以上是关于一次获取 LinearLayout 中的所有子视图的主要内容,如果未能解决你的问题,请参考以下文章
如何在android中直接获取所有子视图和hirechery
自定义布局上的Onlayout方法扩展LinearLayout