zoukankan      html  css  js  c++  java
  • EditText 无法失焦与失焦后键盘不收缩解决方案

    背景

    有一个需求,比方说下图:

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

    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。

  • 相关阅读:
    java 对象属性复制,将一个对象的属性值赋值给另一个对象, 属性名需要相同
    文件上传设置上传文件大小
    layui form.on('select(xxx)',function(){});绑定失败
    列表显示, 内容过长省略显示, 鼠标停留在内容上显示全部内容
    mybatis : ERROR. token : COMMA, pos : 373
    js判断手机系统
    vue v-nav指令属性列表
    第五节 tensorboard可视化
    第四节 生成随机张量和张量合并
    第三节 张量
  • 原文地址:https://www.cnblogs.com/aoximin/p/12036473.html
Copyright © 2011-2022 走看看