Android 关于软键盘的显示和隐藏爬坑记录

Android 关于软键盘的显示和隐藏爬坑记录

之前项目中关于软键盘的隐藏和显示在BaseAcitivity中做的处理是点击空白位置隐藏软键盘

    /**
     * 点击空白位置 隐藏软键盘
     */
    public boolean onTouchEvent(MotionEvent event) {
        if (null != this.getCurrentFocus()) {
            InputMethodManager mInputMethodManager = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);
            return mInputMethodManager.hideSoftInputFromWindow(this.getCurrentFocus().getWindowToken(), WindowManager.LayoutParams.SOFT_INPUT_STATE_UNSPECIFIED);
        }
        return super.onTouchEvent(event);
    }

    getCurrentFocus()方法作用是获取当前焦点所在的View,一般情况是不会为null的,但是写代码还是要严谨...

貌似简单布局下的就完全够用了... (强行解释)
今天写的布局是EditView下面是还有一层RecyclerView,喔不对,应该是同级别的不然RecyclerView最后的条目会被遮挡住,这个时候上面的方法貌似就不够用了...

为什么?这个方法在Activity做的事件监听,到RecyclerView的时候Activity的OnTouchEvent已经失效了可以理解被已经被消费了,RecyclerView的OnTouchEvent优先权高于Activity。
所以我们在onTouchEvent中做的处理也不会被执行了。

既然这样我们依旧手动去控制软键盘的显示的隐藏,去监听RecyclerView的滚动事件

 mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
     @Override
      public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
        //滚动时当软键盘显示时隐藏
        if (newState != 0 && UtilsHelper.isShowSoftInput(TimeLineDetailsActivity.this, mEditComment) == true) {
             UtilsHelper.hideSoftInput(TimeLineDetailsActivity.this, mEditComment);
               mEditComment.clearFocus();
            }
      }

      @Override
         public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
           super.onScrolled(recyclerView, dx, dy);
         }
     });

newState为recyclerView的滚动状态:
public static final int SCROLL_STATE_IDLE = 0; 没有滚动静止状态
public static final int SCROLL_STATE_DRAGGING = 1; 正在被外部拖拽,一般为用户正在用手指滚动
public static final int SCROLL_STATE_SETTLING = 2; 自动滚动

也就是说在非0的情况下即为滚动状态,同时我们还要判断滚动时软键盘是否为显示状态。

    /**
     * 获取软键盘状态
     * @param context
     * @return
     */
    public static boolean isShowSoftInput(Context context,View view) {
        InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
        //获取状态信息
        return imm.isActive(view);//true 打开
    }

isActive(View view) ,isActive()这俩个方法,开始没有传view,发现是可行的,软键盘可以隐藏,后来打log发现这个一直返回的是true啊,难怪!最后测试给参数view,在软键盘隐藏的时候为false,显示的时候未true,这就很明了了。
public boolean isActive (View view)视图为当前输入的激活视图时返回真。
public boolean isActive ()输入法中的任意视图激活时返回真。

意思就是如果该view是输入法的活动view则返回true也可以理解为由该view触发的软键盘弹出则返回true,反之为false。

妥妥的,问题解决。
同时我在google的时候看到好多blog写的方法

if(getWindow().getAttributes().softInputMode==WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN)      无效!!!

InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(0, InputMethodManager.HIDE_NOT_ALWAYS); 
这种方法貌似可以,可能针对场景不同而异,并未做更多测试。
就是改变输入法状态,如果当前未显示则显示出来。如果显示出来,则隐藏

还有一种是动态计算布局来判断软键盘是否显示(并未做测试)

附软键盘手动显示、隐藏、状态判断工具类:

public class UtilsHelper {
 /**
     * 显示软键盘
     * @param context
     * @param view
     */
    public static void showSoftInput(final Context context, final View view) {

        Timer timer = new Timer();
        timer.schedule(new TimerTask() {
            public void run() {
                InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
                imm.showSoftInput(view, WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
            }
        }, 998);
    }

    /**
     * 隐藏软键盘
     * @param context
     * @param view
     */
    public static void hideSoftInput(Context context, View view) {
        InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.hideSoftInputFromWindow(view.getWindowToken(), WindowManager.LayoutParams.SOFT_INPUT_STATE_UNSPECIFIED);
    }

    /**
     * 获取软键盘状态
     * @param context
     * @return
     */
    public static boolean isShowSoftInput(Context context,View view) {
        InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
        //获取状态信息
        return imm.isActive(view);//true 打开
    }
}

本文完,如有问题、错误欢迎评论指出谢谢!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,884评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,347评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,435评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,509评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,611评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,837评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,987评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,730评论 0 267
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,194评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,525评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,664评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,334评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,944评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,764评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,997评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,389评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,554评论 2 349

推荐阅读更多精彩内容