从主布局访问包含布局的所有子元素
Access all children elements of included layouts from main layout
我有一个 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);
}
}
但是由于 <include>
标签,我无法访问此代码中的所有 EditText
。
有什么办法吗?
注意:基本上,所有想要做的就是禁用我的布局中存在的所有 EditText
。
在您的循环中,您只是迭代布局的第一级子级(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
都是它的子类。
我有一个 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);
}
}
但是由于 <include>
标签,我无法访问此代码中的所有 EditText
。
有什么办法吗?
注意:基本上,所有想要做的就是禁用我的布局中存在的所有 EditText
。
在您的循环中,您只是迭代布局的第一级子级(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
都是它的子类。