获取视图中所有EditText的方法

任何人都可以帮助我编写一个方法来获取视图中的所有EditTexts? 我想实现解决方案htafoya张贴在这里:如何在单击外部EditText后隐藏软键盘?

不幸的是, getFields()方法缺失,htafoya没有回答我们分享他的getFields()方法的请求。


编辑

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 ) );

你也可以不使用EditText列表,而是有一个ID列表,然后将这个孩子的ID添加到列表中: myIdList.add( child.getId() );


要访问您的布局,您需要获取它的参考。 这意味着您需要在XML中为您的布局提供一个ID:

<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的持有者。


下面是我写的递归检查ViewGroup的所有EditText子项的方法,方便我必须做的很长的注册表单,并且可能更易于维护。

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;
}

您可以通过调用View#getFocusables来完成此操作,该操作将返回View中所有可聚焦视图的数组列表。

然后,您可以使用( instanceof )检查它们是否为EditText ,或者对其进行操作。

链接地址: http://www.djcxy.com/p/93355.html

上一篇: Method to get all EditTexts in a View

下一篇: How to capture the "virtual keyboard show/hide" event in Android?