微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

EditText 无法失焦与失焦后键盘不收缩解决方案

背景

一个需求,比方说下图:


点击了上图的Image 区域才可以编辑。
那么我首先想到的就是:

@H_404_11@android:focusable="false"

不让它获取到焦点不就ok吗?
事实上这是很好的方式,然后我开始编辑点击图片后EditText获取焦点:

editText.setSelection(editText.getText().length());//设置焦点位置移到最后,如果没有这一句,那么焦点将会在最前
editText.setFocusable(true);
editText.setFocusableInTouchMode(true);
editText.requestFocus();// 请求焦点

ps:

editText.setFocusable(true); //物理按键可获得焦点,一般智能电视机,我们的遥控操作之类
editText.setFocusableInTouchMode(true); ////触摸可获得焦点

上述如果有一个不为true,android系统都会认为不能获取焦点。
出现了一个小小的问题,拥有焦点后,居然没有弹出软键盘。这时候开发者主动点,把它盘出来。

InputMethodManager  inputManager=(InputMethodManager)getBaseContext().getSystemService(Context.INPUT_METHOD_SERVICE);
inputManager.showSoftInput(editText,InputMethodManager.SHOW_FORCED);

这样似乎ok了的。
那么糟糕的情况来了,当我点击EditText的以外的地方的时候,焦点还在Edit上面,焦点并没有消失。

解决方

@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
	switch (ev.getAction()) {
		case MotionEvent.ACTION_DOWN:
			View edittext=findViewById(R.id.edittext);
			//判断是否被点击
			if (!isTouchPointInView(edittext,(int) ev.getX(),(int) ev.getY()))
			{
			   edittext.clearFocus();
			}
			break;
	}
	return super.dispatchTouchEvent(ev);
}

我通过判断如果不在触摸区域内,就让它失去焦点。
按照这个想法,我的确成功了,然而凡事哪有一帆风顺,我遭遇到了另外一个bug。那就是,焦点失去了,然而软键盘还在。
这时候我想到了焦点变动事件,code 如下:

findViewById(R.id.edittext).setonFocuschangelistener(new View.OnFocuschangelistener(){
	@Override
	public  void onFocusChange(View v,boolean hasFocus)
	{
		EditText editText=(EditText)v;
		if (!hasFocus)
		{
			InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
			imm.hideSoftInputFromWindow(getwindow().getDecorView().getwindowToken(), 0);
		}
	}
});

是的,失去了焦点那么就让软键盘消失。

其他需要注意的

其他问题,比如页面back了,或者退出了app,我们都需要手动去让软键盘隐藏,事件分别是@Override的:onStop与onBackpressed

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐