软键盘相关

112 阅读2分钟

项目中有类似陌陌输入框的UI,因为Edittext不在输入框底部,导致软键盘弹出时显示在Edittext底部而遮挡掉输入框部分UI,目前采用的方法是对Viewtree进行监听,软键盘弹起来时,进行scrollTo移动输入框

private void configureViewTreeObserver(View root, View scrollToView) {
        root.getViewTreeObserver().addOnGlobalLayoutListener(() -> {
            Rect rect = new Rect();
            //获取到界面可见区域的矩形
            root.getWindowVisibleDisplayFrame(rect);
            //根布局高度 - 可见区域高度 = 软键盘高度
            int keyboardHeight = root.getRootView().getHeight() - rect.bottom;
            if (keyboardHeight > 100) {
                //如果像素数大于100极大可能是软键盘弹出
                mIsKeyboardOpened = true;
                //处理Edittext不在输入框底部的情况
                int[] location = new int[2];
                scrollToView.getLocationInWindow(location);
                //输入框在界面上Y轴坐标 + 输入框高度 - 可见区域底部
                root.scrollTo(0, location[1] + scrollToView.getHeight() - rect.bottom);
            } else {
                //软键盘收起
                root.scrollTo(0, 0);
                if (mIsKeyboardOpened) {
                    mIsKeyboardOpened = false;
                    DanmakuInputDialog.this.dismiss();
                }
            }
        });
    }

##android:windowSoftInputMode属性 输入框以DialogFragment的方式进行视图叠加实现,没有用到windowSoftInputMode属性,不过这里也总结一下

<activity android:windowSoftInputMode="stateVisible|adjustResize". . . >

activity主窗口与软键盘的交互模式,可以用来避免输入法面板遮挡问题,Android1.5后的一个新特性。 这个属性能影响两件事情:

  • 当有焦点产生时,软键盘是隐藏还是显示
  • 是否减少活动主窗口大小以便腾出空间放软键盘

各值如下:

  • stateUnspecified:软键盘的状态并没有指定,系统将选择一个合适的状态或依赖于主题的设置
  • stateUnchanged:当这个activity出现时,软键盘将一直保持在上一个activity里的状态,无论是隐藏还是显示
  • stateHidden:用户选择activity时,软键盘总是被隐藏
  • stateAlwaysHidden:当该Activity主窗口获取焦点时,软键盘也总是被隐藏的
  • stateVisible:软键盘通常是可见的
  • stateAlwaysVisible:用户选择activity时,软键盘总是显示的状态
  • adjustUnspecified:默认设置,通常由系统自行决定是隐藏还是显示
  • adjustResize:该Activity总是调整屏幕的大小以便留出软键盘的空间
  • adjustPan:当前窗口的内容将自动移动以便当前焦点从不被键盘覆盖和用户能总是看到输入内容的部分

##android:imeOptinos属性 Android在横屏时唤起软键盘会默认全屏展示,当使用imeOptions时可以解决问题。

<Edittext android:imeOptions="flagNoExtractUi">
  • android:imeOptions="flagNoExtractUi" //使软键盘不全屏显示,只占用一部分屏幕 同时,这个属性还能控件软键盘右下角按键的显示内容,默认情况下为回车键
  • android:imeOptions="actionNone" //输入框右侧不带任何提示
  • android:imeOptions="actionGo" //右下角按键内容为'开始'
  • android:imeOptions="actionSearch" //右下角按键为放大镜图片,搜索
  • android:imeOptions="actionSend" //右下角按键内容为'发送'
  • android:imeOptions="actionNext" //右下角按键内容为'下一步'
  • android:imeOptions="actionDone" //右下角按键内容为'完成'