EditText无法失去焦点、失去焦点隐藏软键盘

很奇怪,我在给EditText设置setOnFocusChangeListener()监听,但是始终未能成功,焦点一直存在,不知其原因,,代码如下:

 1     et_username.setOnFocusChangeListener(new OnFocusChangeListener() {
 2             @Override
 3             public void onFocusChange(View v, boolean hasFocus) {
 4                 if (!hasFocus) {
 5                     String tempName = et_username.getText().toString().trim();
 6                     if (!tempName.equals(userName) && tempName.length() > 0) {
 7                         // 发送新昵称
 8                         UIHelper.ToastMessage(getActivity(), "可以发送新昵称了。。。");
 9                         sendNewName(tempName);
10                     } else {
11                         et_username.setText(userName);
12                         UIHelper.ToastMessage(getActivity(), "新昵称太短或无改变");
13                     }
14                     // 影藏软键盘
15                     InputMethodManager imm = (InputMethodManager) getActivity()
16                             .getSystemService(Context.INPUT_METHOD_SERVICE);
17                     imm.hideSoftInputFromWindow(et_username.getWindowToken(), 0);
18                 }
19             }
20         });

 

(PS:edittext会在界面生成是自动获取焦点,从而软键盘会自动被调出,如果对这一现象觉得体验性较差可在edittext生成后强行给他去掉焦点:edittext.clearFocus();)

先解决无法失去焦点的情况,再点击edittext的时候可以获得了焦点(这个测试过没有问题),但是点击其他地方的时候软键盘一直存在,光标依然在edittext中闪烁,设置的失去焦点的操作也没有执行,很奇怪,为什么可以得到焦点却失去不了焦点呢?伟大的度娘告诉我要这么干:

如果是Activity,可以直接时间ontachevent方法,在方法中写入

1     @Override
2     public boolean onTouch(View v, MotionEvent event) {
3 
4         layout.setFocusable(true);
5         layout.setFocusableInTouchMode(true);
6         layout.requestFocus();
7 
8         return super.getActivity().onTouchEvent(event);
9     }

这样就可以失去焦点,执行监听里失去焦点的操作了(原因尚未整明白。。。)

如果是Fragment ,可对最外围的布局设置OnTouchListener监听,实现onTouch方法,代码如上,一样。

再来解决影藏软键盘,这个比较简单,主要是上一步如何失去焦点。还是度娘,给fragment最外围布局设置了setOnTouchListener监听,达到了预期的效果,代码如下:

@Override
    public boolean onTouch(View v, MotionEvent event) {
        InputMethodManager imm = (InputMethodManager) getActivity()
                .getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.hideSoftInputFromWindow(et_username.getWindowToken(), 0);
        imm.hideSoftInputFromWindow(et_password.getWindowToken(), 0);
        return true;
    }

这里要解释下返回值true:

Android Developers上查看了一下这个接口和这个方法,文档中对该方法的返回值描述如下:True if the listener has consumed the event, false otherwise。大概意思就是说,如果返回true,则表示监听器消耗了该事件(我的理解就是不用继续向上传递该事件了,该事件的传递到此为止);否则返回false。首先触发到的监听是最底层最直接给它设置的监听,如果是false,并且它的父控件如果也注册次监听,那么它的父控件也会监听也会被触发 ;如果是true,则不会触发父控件的监听。

如果是Activity,直接重写onTouchEvent方法。代码如下:

1     @Override
2     public boolean onTouchEvent(MotionEvent event) {
3         InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
4         imm.hideSoftInputFromWindow(et_username.getWindowToken(), 0);
5         imm.hideSoftInputFromWindow(et_password.getWindowToken(), 0);
6         return super.onTouchEvent(event);
7 
8     }

 很有用的一个关于进入activity后取消主动弹出软件盘的问题的参考:http://blog.sina.com.cn/s/blog_6dc41baf01015wqy.html

还有就是要注意edittext是否存在在ScrollView或ListView当中,如果存在ontach方法会交错混乱,还得另行处理。

 

转载于:https://www.cnblogs.com/ws5861/p/3591195.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
EditText默认获取焦点并弹出软键盘,在Android开发中非常常见和实用。当我们在布局文件中使用EditText控件时,默认情况下,该控件会自动获取焦点并弹出软键盘。 这种默认行为可以方便用户直接对EditText进行输入操作,提高用户的交互体验。当用户点击EditText或切换到包含EditText的布局时,EditText会自动获得焦点,这样用户可以直接进行输入操作。 在代码中,我们可以通过设置android:focusable属性为true来保证EditText默认获取焦点。同时,还可以设置android:focusableInTouchMode属性为true,确保用户触摸到屏幕上的EditText时,它会获取焦点并弹出软键盘。 例如,在布局文件中可以这样设置: <EditText android:id="@+id/editText" android:layout_width="match_parent" android:layout_height="wrap_content" android:focusable="true" android:focusableInTouchMode="true" /> 这样,当布局加载完成后,EditText会自动获取焦点,用户可以直接对其进行输入操作。 需要注意的是,如果你希望EditText不再获取焦点和弹出软键盘,则可以将android:focusable和android:focusableInTouchMode属性设置为false。 尽管EditText默认获取焦点和弹出软键盘在很多情况下非常方便,但有些场景可能不适用,比如登录界面中的密码框,我们可能更愿意让用户手动点击密码框来输入密码,而不是自动弹出软键盘。 总之,EditText默认获取焦点并弹出软键盘是一个很方便的功能,可以提高用户的交互体验,但在一些特殊场景中需要谨慎使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值