• 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方法会交错混乱,还得另行处理。

  • 相关阅读:
    LeetCode:Length of Last Word
    Team Queue(POJ 2259)
    LeetCode:Largest Rectangle in Histogram(update)
    bzoj4821 && luogu3707 SDOI2017相关分析(线段树,数学)
    luogu1438无聊的数列(区间加等差数列,求一个数的和)
    luogu1081 开车旅行2012 D1T3 (倍增,set,O2)
    bzoj4094 && luogu3097 最优挤奶
    luogu3888 GDOI2014拯救莫里斯 (状压dp)
    noip2017D1T3逛公园(拓扑图上dp,记忆化搜索)
    bzoj1065 NOI2008奥运物流 (dp,树上背包,推式子)
  • 原文地址:https://www.cnblogs.com/ws5861/p/3591195.html
Copyright © 2020-2023  润新知