获取视图中的所有EditText的方法

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

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

Solutions Collecting From Web of "获取视图中的所有EditText的方法"

编辑

MByD指出我有一个错误,从而使我的答案几乎与黑带相同。 我编辑了我的正确方法。


你可以做一个for-each循环,然后检查每个视图的types是否为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的持有者。

下面是我写的recursion检查一个ViewGroup的所有EditText子项的方法,方便一个很长的registry单,我必须做,可能更易于维护。

 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 ,或者对它们进行操作。

此方法recursion遍历所有ViewGroups并收集它们的TextViews。 我使用它来为所有的TextView分配一个新的颜色(甚至是那些embedded在预定义的Widget中,比如Switch等使用TextView的)

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