android - 如何获取包括 subview 在内的布局中的 View 总数

标签 android android-layout android-view android-windowmanager

我正在尝试计算向用户显示的任何布局中的所有 View 。为了实现它,使用了下面发布的代码,但正如您在布局中看到的那样,它包含

    Button
    LinearLayout
        Button
        Button
    TextView
    LinearLayout

当代码执行时,它说布局只有 4 个小部件“Button、LinearLayout、TextView、LinearLayout”,而我预计代码会返回 6 个小部件。 您能告诉我如何获取包含子小部件/ View 的布局中包含的总小部件吗?

代码:

public class ActMain extends AppCompatActivity {

private static final String TAG = ActMain.class.getSimpleName();
private LinearLayout mMainContainer = null;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.act_main);

    this.mMainContainer = (LinearLayout) findViewById(R.id.actMain_mainContainer);
    int totalWidgets = this.mMainContainer.getChildCount();
    Log.d(TAG, "totalWidgets:" + totalWidgets);


    for (int i = 0; i < this.mMainContainer.getChildCount(); i++) {
        View view = mMainContainer.getChildAt(i);
    }
}

布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/actMain_mainContainer"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.example.alten.test_traversethroughaview_1.ActMain">

    <Button
        android:id="@+id/actMain_btn_change"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/decision_change" />

        <LinearLayout
            android:id="@+id/actMain_linlay_1"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal">
            <Button
                android:id="@+id/actMain_btn_yes"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="@string/decision_yes" />
            <Button
                android:id="@+id/actMain_btn_no"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="@string/decision_no" />
        </LinearLayout>

        <TextView
            android:id="@+id/actMain_tv_display"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />

        <LinearLayout
            android:id="@+id/actMain_linlay_2"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal">
        </LinearLayout>

最佳答案

使用这个方法:

public int getChildrenViews(ViewGroup parent){
    int count = parent.getChildCount();
    for (int i=0;i<parent.getChildCount();i++){
        if (parent.getChildAt(i) instanceof ViewGroup){
            count+=getChildrenViews((ViewGroup) parent.getChildAt(i));
        }
    }
    return count;
}

任何你想添加这部分的地方:

if (getWindow().getDecorView().getRootView() instanceof ViewGroup){
        getChildrenViews((ViewGroup) getWindow().getDecorView().getRootView());
    }

关于android - 如何获取包括 subview 在内的布局中的 View 总数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44869191/

相关文章:

Android OpenGL 演示 "No config chosen"

Android Youtube Player API Activity 完成并创建

android - 如何从约束布局编辑器中设置 "layout_marginLeft(/Right)"?

java - 在 Android 中更改自定义 View 的宽度和高度

Android 基础知识 : running code in the UI thread

android - 在 LinearLayout 中使用 match_parent 高度和 wrap_content 高度的 View 正在破坏布局

android - 在 recyclerview 中消失的可见性仍然占据空间?

android - sotimeout 在 android 2.1 上的多部分 http 帖子中不起作用

java - 获取菜单组作为 View

android - ButterKnife 使用不同布局在 fragment 中绑定(bind)