获取视图中所有EditTexts的方法

时间:2011-10-17 07:16:42

标签: android

任何人都可以帮我编写一个方法来获取视图中的所有EditTexts吗?我想在这里发布htafoya解决方案: How to hide soft keyboard on android after clicking outside EditText?

遗憾的是getFields()方法丢失了,htafoya没有回复我们分享他的getFields()方法的请求。

5 个答案:

答案 0 :(得分:36)

修改

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列表,有一个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持有者。

答案 1 :(得分:10)

这是我写的一个方法,用于递归检查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;
}

答案 2 :(得分:6)

您可以通过调用View#getFocusables来执行此操作,这将返回视图中所有可聚焦视图的arraylist。

然后,您可以检查它们是EditText s,(instanceof)还是对所有这些进行检查。

答案 3 :(得分:2)

此方法以递归方式遍历所有ViewGroup并收集其TextView。我使用它为所有TextViews分配一个新的颜色(甚至那些嵌入预定义的Widgets中的那些,如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;
}

答案 4 :(得分:0)

以任何类型的布局获取所有“编辑文本”。

public List<EditText> getAllEditTexts(ViewGroup layout){
        List<EditText> views = new ArrayList<>();
        for(int i =0; i< layout.getChildCount(); i++){
            View v =layout.getChildAt(i);
            if(v instanceof EditText){
                views.add((EditText)v);
            }
        }
        return views;
    }