Подтвердить что ты не робот

Способ получения всех EditTexts в представлении

Может ли кто-нибудь помочь мне с кодированием метода, чтобы получить все EditTexts в представлении? Я хотел бы реализовать решение htafoya, размещенное здесь: Как скрыть мягкую клавиатуру на андроиде, щелкнув вне EditText?

К сожалению, метод getFields() отсутствует, и htafoya не ответил на наш запрос, чтобы поделиться его методом getFields().

4b9b3361

Ответ 1

ИЗМЕНИТЬ

MByD указал мне на ошибку, таким образом сделав мой ответ почти таким же, как у черных. Я редактировал мой правильный подход.


Вы можете сделать цикл for-each, а затем проверить, имеет ли каждый вид тип EditText:

ArrayList<EditText> myEditTextList = new ArrayList<EditText>();

for( int i = 0; i < myLayout.getChildCount(); i++ )
  if( myLayout.getChildAt( i ) instanceof EditText )
    myEditTextList.add( (EditText) myLayout.getChildAt( i ) );

Вы также можете вместо списка EditTexts иметь список идентификаторов, а затем просто добавить идентификатор дочернего элемента в список: myIdList.add( child.getId() );


Чтобы получить доступ к макету, вам нужно получить ссылку на него. Это означает, что вам необходимо предоставить идентификатор вашего макета в вашем XML:

<LinearLayout android:id="@+id/myLinearLayout" >
   //Here is where your EditTexts would be declared
</LinearLayout>

Затем, когда вы раздуваете макет в своей деятельности, вы просто сохраняете ссылку на него:

LinearLayout myLinearLayout;

public void onCreate( Bundle savedInstanceState ) {
   super( savedInstanceState );
   setContentView( R.layout.myLayoutWithEditTexts );

   ...

   myLinearLayout = (LinearLayout) findViewById( R.id.myLinearLayout );
}

Затем у вас есть ссылка на владельца вашего EditTexts в рамках действия.

Ответ 2

Здесь метод, который я написал, чтобы рекурсивно проверять все дети EditText группы ViewGroup, удобен для длинной формы регистрации, которую я должен был сделать, и, вероятно, более удобной для обслуживания.

private EditText traverseEditTexts(ViewGroup v)
{
    EditText invalid = null;
    for (int i = 0; i < v.getChildCount(); i++)
    {
        Object child = v.getChildAt(i); 
        if (child instanceof EditText)
        {
            EditText e = (EditText)child;
            if(e.getText().length() == 0)    // Whatever logic here to determine if valid.
            {
                return e;   // Stops at first invalid one. But you could add this to a list.
            }
        }
        else if(child instanceof ViewGroup)
        {
            invalid = traverseEditTexts((ViewGroup)child);  // Recursive call.
            if(invalid != null)
            {
                break;
            }
        }
    }
    return invalid;
}

private boolean validateFields()
{   
    EditText emptyText = traverseEditTexts(mainLayout);
    if(emptyText != null)
    {
        Toast.makeText(this, "This field cannot be empty.", Toast.LENGTH_SHORT).show();
        emptyText.requestFocus();      // Scrolls view to this field.
    }
    return emptyText == null;
}

Ответ 3

Вы можете сделать это, вызвав View#getFocusables, который вернет arraylist всех фокусируемых представлений в представлении.

Затем вы можете проверить, являются ли они EditText s, с (instanceof) или действуют на всех них.

Ответ 4

Эти методы проходят рекурсивно через все группы представлений и собирают их текстовые элементы. Я использую это, чтобы назначить новый цвет всем TextViews (даже тем, которые встроены в предопределенные виджеты, такие как Switch и т.д., Которые используют TextViews)

private HashSet<TextView> getTextViews(ViewGroup root){
    HashSet<TextView> views=new HashSet<>();
    for(int i=0;i<root.getChildCount();i++){
        View v=root.getChildAt(i);
        if(v instanceof TextView){
            views.add((TextView)v);
        }else if(v instanceof ViewGroup){
            views.addAll(getTextViews((ViewGroup)v));
        }
    }
    return views;
}