【问题标题】:Access all children elements of included layouts from main layout从主布局访问包含布局的所有子元素
【发布时间】:2017-05-01 10:17:26
【问题描述】:

我有一个activity_main 布局,看起来像以下布局:

<RelativeLayout
    android:id = "@+id/wrapper"
    android:layout_width = "wrap_content"
    android:layout_height = "wrap_content"
    android:layout_alignParentBottom = "true"
    android:layout_gravity = "bottom"
    android:gravity = "bottom">
    <include
        android:id = "@+id/call_to_action"
        layout = "@layout/call_to_action_layout"
        android:layout_width = "fill_parent"
        android:layout_height = "wrap_content"/>
    <include
        android:id = "@+id/status"
        layout = "@layout/status_layout"
        android:layout_width = "fill_parent"
        android:layout_height = "wrap_content"/>
</RelativeLayout>

我包含的两个布局都如下所示:

这是call_to_action_layout.xml

<LinearLayout
    android:id = "@+id/action_button_container"
    android:layout_height = "wrap_content"
    android:layout_width = "fill_parent"
    xmlns:android = "http://schemas.android.com/apk/res/android">

    <EditText
        android:id="@+id/edit_text_1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="1" />

    <EditText
        android:id="@+id/edit_text_2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="1" />
</LinearLayout>

还有status_layout.xml

<LinearLayout
    android:id = "@+id/another_container"
    android:layout_height = "wrap_content"
    android:layout_width = "fill_parent"
    xmlns:android = "http://schemas.android.com/apk/res/android">

    <EditText
        android:id="@+id/edit_text_3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="1" />

    <EditText
        android:id="@+id/edit_text_4"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="1" />
</LinearLayout>

在MainActivity.java 中,我正在尝试设置我的activity_main.xml 中存在的所有EditText 的属性。为此,我需要循环访问并访问我的布局中存在的每个EditText。

这是我迄今为止在MainActivity.java中尝试过的内容

RelativeLayout container = findViewById(R.id.wrapper);

for (int i = 0; i < container.getChildCount(); i++) {
    Log.d(TAG, "id: " + container.getChildAt(i));

    if (container.getChildAt(i) instanceof EditText) {
        EditText editText =
            (EditText) container.getChildAt(i);
        editText.setKeyListener(null);
    }
}

但由于&lt;include&gt; 标签,我无法访问此代码中的所有EditText。

有没有办法做到这一点?

注意:基本上,所有想要做的就是禁用我布局中存在的所有EditText。

【问题讨论】:

  • 但由于 标签,我无法访问此代码中的所有 EditText。 - 我不太明白。您应该能够在您的MainActivity.java 包含的布局中使用findViewById。你试过了吗?

标签: android xml android-layout android-include


【解决方案1】:

在您的循环中,您只会遍历布局的第一级子级(call_to_action 和 status)。

您可以像这样执行两个循环:

ViewGroup call_to_action = findViewById(R.id.call_to_action)
for (int i = 0; i < call_to_action.getChildCount(); i++)
{
    Log.d(TAG, "id: " + call_to_action.getChildAt(i));
    if (container.getChildAt(i) instanceof EditText)
    {
        EditText editText =
            (EditText) call_to_action.getChildAt(i);
        editText.setKeyListener(null);
    }
}

ViewGroup status = findViewById(R.id.status)
for (int i = 0; i < status.getChildCount(); i++)
{
    Log.d(TAG, "id: " + status.getChildAt(i));
    if (status .getChildAt(i) instanceof EditText)
    {
        EditText editText =
            (EditText) status.getChildAt(i);
        editText.setKeyListener(null);
    }
}

或者创建一个像这样的递归方法:

public void removeKeyListeners(ViewGroup container){
for (int i = 0; i < container.getChildCount(); i++)
    {
        Log.d(TAG, "id: " + container.getChildAt(i));
        if (container.getChildAt(i) instanceof EditText)
        {
            EditText editText =
                (EditText) container.getChildAt(i);
            editText.setKeyListener(null);
        } else if (container.getChildAt(i) instanceof ViewGroup) {
              removeKeyListeners((ViewGroup) container.getChildAt(i));
        }
    }
}

并为您的布局调用它:

removeKeyListeners(container);

注意:这里使用ViewGroup,因为所有Layouts都是它的子类。

【讨论】:

    猜你喜欢
    • 2012-02-19
    • 1970-01-01
    • 1970-01-01
    • 2016-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多