访问从主要布局包括布局的所有子元素

问题描述:

我有一个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我想设置所有EditText的属性,这些属性存在于我的activity_main.xml中。为此,我需要循环访问我的布局中的每个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

+0

但由于标记,我无法访问此代码中的所有EditText。 - 我不太明白这一点。你应该能够从'MainActivity.java'的包含的布局中'findViewById'。你试过了吗? –

在你的循环中,你只是遍历布局的第一级子代(call_to_actionstatus)。

您可以做两个循环是这样的:

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都是它的子类。