2016-12-15 4 views
0

У меня есть 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 в этом коде. - Я не совсем понял это. Вы должны иметь возможность «findViewById» во включенных макетах из вашего «MainActivity.java». Ты пробовал? –

ответ

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 являются его подклассами.