一次获取 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

从 LinearLayout (Android) 中删除所有视图

在 LinearLayout 中获取视图的索引

在自定义视图中获取 LinearLayout 参考