【问题标题】:How to get the Chid Layout's children?如何获得 Child Layouts 的孩子?
【发布时间】:2018-04-02 06:44:29
【问题描述】:

我尝试在加载时获取当前活动中的所有 WebView 元素并获得输出。
它运行良好。

代码:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.example.dmp_webview.MainActivity"
    android:orientation="vertical">

       <WebView
            android:id="@+id/simpleWebView"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:layout_marginTop="20dp"
            android:scrollbars="none" />

       <WebView
            android:id="@+id/simpleWebView2"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:layout_marginTop="20dp"
            android:scrollbars="none" />
</LinearLayout>

private void forWebviews() {

    final ViewGroup viewGroup = (ViewGroup) ((ViewGroup) this
            .findViewById(android.R.id.content)).getChildAt(0);

    int elementSize = getWenViews(viewGroup).size();
    for(int j =0; j< elementSize;j++)
    {           
        WebView getAllWebView = formIsValid(viewGroup).get(j);
        String SplitTypeWebView = String.valueOf(getAllWebView);
        String getWebValues = getAllWebView.getUrl().toString();
        SplitWebViewID(SplitTypeWebView);
     }  
}

    private ArrayList<WebView> getWenViews(ViewGroup viewGroup) {

        ArrayList<WebView> webview = new ArrayList<WebView>();
        for (int i = 0; i < viewGroup.getChildCount(); i++) {
            View v = viewGroup.getChildAt(i);
            if (v instanceof WebView) {
                webview.add((WebView) v);
            }
        }
        return webview;
    }

但是,当我为 webview 父级再添加一个 LinearLayout(不仅是 linearlayout 其他布局)时,

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.example.dmp_webview.MainActivity"
    android:orientation="vertical">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#ffffff"
        android:orientation="vertical"
        android:padding="16dp"
        android:id="@+id/RootLayout_1">

           <WebView
                android:id="@+id/simpleWebView"
                android:layout_width="fill_parent"
                android:layout_height="fill_parent"
                android:layout_marginTop="20dp"
                android:scrollbars="none" />

           <WebView
                android:id="@+id/simpleWebView2"
                android:layout_width="fill_parent"
                android:layout_height="fill_parent"
                android:layout_marginTop="20dp"
                android:scrollbars="none" />

     </LinearLayout>

</LinearLayout>

它无法正常工作。为什么?它不会返回任何子视图计数。我需要澄清一件事。

  • 是否可以获取所有子布局的子项。 (例如) ROOT LAYOUT -> LinearLayout(一些其他布局)->LinearLayout(一些其他布局)-Views

请指导我。实际上我得到了根布局并迭代。 如何在运行时获取所有子视图?有多少根布局或子布局或视图无关紧要。我需要得到所有。

【问题讨论】:

  • ViewGroup#getChild*() 方法仅处理直接子 Views,因此您不会在嵌套的 ViewGroups 中获得那些 WebViews。在getWenViews() 中,if 需要一个else if,以防孩子是另一个ViewGroupelse if (v instanceof ViewGroup) { webview.addAll(getWenViews((ViewGroup) v)); }
  • 您是要获取布局中的所有WebViews 还是特定ViewGroup 中的所有WebViews?
  • @MikeM。是的,麦克你是对的,它只会获得直接的子视图,根据逻辑我需要添加 else if 检查其他视图组。我会尝试更新给你
  • @Titus 需要获取所有视图(视图组/网络视图无关紧要,如果可能意味着同时需要这两个视图)
  • 谢谢@MikeM。我忘记了getAll()

标签: java android android-layout


【解决方案1】:

需要获取所有视图(视图组/网络视图无关紧要,如果可能意味着同时需要它们)

您可以为此使用递归方法。

这是一个例子:

private static void getViews(list, ViewGroup viewGroup){
    for(int i = 0; i < viewGroup.getChildCount(); i++){
        View view = viewGroup.getChildAt(i);
        list.add(view);
        if(view instanceof ViewGroup){
            getViews((ViewGroup) view);
        }
    }
}

这就是你的称呼。

List<View> list = new ArrayList<View>();
getViews(list, (ViewGroup) this.findViewById(android.R.id.content));

如果你想过滤WebViews,你可以这样做:

List<WebView> webViews = new ArrayList<WebView>();
for(View view : list){
    if(view instanceof WebView){
        webViews.add((WebView) view);
    }
}

【讨论】:

    猜你喜欢
    • 2018-04-28
    • 1970-01-01
    • 2020-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-14
    • 1970-01-01
    相关资源
    最近更新 更多