将焦点从一个EditText移动到另一个EditText

我为创建帐户活动设计了一个布局。

当一个EditText失去焦点时,我正在对输入进行一些检查,如果出现问题,我想重新关注EditText

我已经看到了一些关于这个的问题,但它不适合我(或者我做错了什么)。

当我触摸一个触发requestFocus()的不同EditText时,焦点仍然在当前的EditText而另一个焦点图标显示在EditText ,它会重新显示焦点。

请帮忙

这是我的布局文件:

                                 

在我喜欢的代码中:

 final EditText userEditText = (EditText)findViewById(R.id.userEditText); userEditText.setOnFocusChangeListener(new OnFocusChangeListener() { @Override public void onFocusChange(View v, boolean hasFocus) { if(!hasFocus){ Log.i(TAG, "userEditText lost focus"); m_userName = userEditText.getText().toString(); if(m_userName.length() < 6){ m_signUpText.setText("Username should have at least 6 characters"); userEditText.requestFocus(); } else{ checkUserNameExists(); } } } }); 

您可以在第一个EditText上侦听此动作EditorInfo.IME_ACTION_NEXT ,然后通过此调用requestFocus()请求焦点到第二个,这是一个示例:

 firstEditText.setOnEditorActionListener(new OnEditorActionListener() { @Override public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { if (actionId == EditorInfo.IME_ACTION_NEXT) { secondEditText.requestFocus(); return true; } return false; } }); 

在这里找到了解决方案

这个解决方案有效(无需添加android:focusable =“true”\ android:focusableInTouchMode =“true”):

 final EditText userEditText = (EditText)findViewById(R.id.userEditText); userEditText.setOnFocusChangeListener(new OnFocusChangeListener() { @Override public void onFocusChange(View v, boolean hasFocus) { if(!hasFocus){ Log.i(TAG, "userEditText lost focus"); if(null == m_requestFocus){ m_userName = userEditText.getText().toString(); if(m_userName.length() < 6){ m_signUpText.setText("Username should have at least 6 characters"); m_requestFocus = userEditText; } else{ checkUserNameExists(); } } } else{ if(null != m_requestFocus & m_requestFocus != userEditText){ v.clearFocus(); m_requestFocus.requestFocus(); m_requestFocus = null; } } } }); 

澄清问题:

用户编辑EditText A - >用户触摸EditText B进行编辑 - > EditText调用onFocusListener.onFocusChanged - > EditText一个requestFocus - > EditText B仍然具有焦点并键入任何文本,写入其编辑文本。 EditText A上只显示焦点标记。

首先,你为什么提供

android:focusable="true" android:focusableInTouchMode="true"

要布局,而不是EditText字段?

第二个 – 来自dev.andro的requestFocus()定义:“调用它来尝试将焦点放在特定视图或其后代之一上。”

结论将是一个问题,因为我很难理解你所说的。 这是有效的,重点是留在userEditText但是其他一些EditText有焦点View的选择器?

这适用于我,它看起来不那么hackish。

所做的是将Runnable中的requestFocus()发送到进程消息队列。 与上面的链接不同,我不需要清除其他字段的焦点,也不需要postDelayed。 我的代码

  new Handler().post(new Runnable() { @Override public void run() { ev1.requestFocus(); } });