获取视图中所有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
,或者对其进行操作。
上一篇: Method to get all EditTexts in a View
下一篇: How to capture the "virtual keyboard show/hide" event in Android?