在我的活动中,我有一个editText字段。当用户点击它时,editText获得焦点并出现键盘。现在,当用户按下电话上的硬件后退按钮时,键盘消失,但光标仍保留在Edittext中,i。例如,它仍然是焦点。按下后退按钮时是否可以使EditText失去焦点?我尝试使用以下代码,但它不起作用:
@Override
public void onBackPressed() {
vibrator.vibrate(Constants.DEFAULT_VIBRATE_TIME);
myEditText.clearFocus();
super.onBackPressed();
}
只需扩展EditText:
public class EditTextV2 extends EditText
{
public EditTextV2( Context context )
{
super( context );
}
public EditTextV2( Context context, AttributeSet attribute_set )
{
super( context, attribute_set );
}
public EditTextV2( Context context, AttributeSet attribute_set, int def_style_attribute )
{
super( context, attribute_set, def_style_attribute );
}
@Override
public boolean onKeyPreIme( int key_code, KeyEvent event )
{
if ( event.getKeyCode() == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_UP )
this.clearFocus();
return super.onKeyPreIme( key_code, event );
}
}
而在xml中只需使用<yourPackage.EditTextV2>
而不是<EditText>
。
注意:根据您支持的最小API,您可能需要向此类添加/删除构造函数。我建议只添加它们并删除super()
调用的下划线为红色的那些。
你可以让你的另一个Views
可以集中,例如ImageView
。一定要使它在触摸模式下可聚焦,使用setFocusableInTouchMode(true)
和onResume()
使View
到requestFocus()
。
您还可以创建一个0维的虚拟View
并执行上述相同的步骤。
我希望这有帮助。
添加以下高于EditText的视图:
<LinearLayout
android:layout_width="0px"
android:layout_height="0px"
android:focusable="true"
android:focusableInTouchMode="true" />
另外要隐藏键盘,请在onBackPressed()中添加:
((InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE)).hideSoftInputFromWindow(myEditText.getWindowToken(), 0);
对于使用Kotlin和Material Design的任何人,您可以使用:
class ClearFocusEditText: TextInputEditText {
constructor(context: Context) : super(context)
constructor(context: Context, attrs: AttributeSet) : super(context, attrs)
constructor(context: Context, attrs: AttributeSet, defStyleAttr: Int) : super(context, attrs, defStyleAttr)
override fun onKeyPreIme(keyCode: Int, event: KeyEvent?): Boolean {
if(keyCode == KeyEvent.KEYCODE_BACK) {
clearFocus()
}
return super.onKeyPreIme(keyCode, event)
}
}
这可能是一个可能的解决方案:
EditText et;
et.setOnKeyListener(new View.OnKeyListener() {
@Override
public boolean onKey(View view, int i, KeyEvent keyEvent) {
if(i == KeyEvent.KEYCODE_BACK) {
et.clearFocus();
return true;
}
else return false;
}
});