2011-01-26 2 views
52

У меня есть вид с радиоприемниками, входами и кнопкой, и когда я нажимаю на него, я хочу проверить, что все входы содержат информацию. Как я могу перебирать элементы представления в активности и проверять, соответствует ли каждое текстовое представление вышеупомянутому требованию? Благодарю.Как перебирать элементы вида

ответ

108

я сделал что-то подобное в некотором коде у меня нет со мной в данный момент, но из памяти это должно быть что-то вроде этого (предполагая, что родительский вид LinearLayout с идентификатором «макета»):

LinearLayout layout = (LinearLayout)findViewById(R.id.layout); 
boolean success = formIsValid(layout); 

public boolean formIsValid(LinearLayout layout) { 
    for (int i = 0; i < layout.getChildCount(); i++) { 
     View v = layout.getChildAt(i); 
     if (v instanceof EditText) { 
      //validate your EditText here 
     } else if (v instanceof RadioButton) { 
      //validate RadioButton 
     } //etc. If it fails anywhere, just return false. 
    } 
    return true; 
} 
+0

Мне нравится использование getClass. Я предполагаю, что в табличном или подобном виде типа контейнера можно использовать рекурсивный вызов, чтобы забрать эти внутренние дети, верно? – Lumis

+1

Хороший вопрос! Я бы так подумал. Я полагаю, вы могли бы заставить функцию formIsValid принять общий параметр View и cast, чтобы вы могли сделать что-то вроде 'if (c == TableLayout.class), если (! FormIsValid (v)) return false;'. Вам нужно будет не возвращать true после вложенного макета, чтобы не выходить из него, прежде чем заканчивать оставшуюся часть оригинальной формы. – kcoppock

+0

Именно так, getChildAt() возвращает только табло. – xain

0

Ваш onClickListener поставляет объект View v; используйте View rV = v.getRootView(), чтобы разместить себя на форме. Затем используйте rV.findViewWithTag(...) или rV.findViewByID(R.id. ...), чтобы найти элементы вашей формы.

+1

Спасибо за ваш ответ, но там должен быть более «общий» путь. Что-то вроде «итерации через все элементы вида, которые имеют тип TextView». – xain

+0

Я думал, что так же, но безрезультатно ... – gssi

14

чтобы применить метод, kcoppock рекурсивно, вы можете изменить его к этому:

private void loopViews(ViewGroup view) { 
    for (int i = 0; i < view.getChildCount(); i++) { 
     View v = view.getChildAt(i); 

     if (v instanceof EditText) { 
      // Do something 

     } else if (v instanceof ViewGroup) { 

      this.loopViews((ViewGroup) v); 
     } 
    } 
}