Android:软键盘

软键盘显示

1、WindowSoftInputMode九种状态(6+3)

(控制软键盘显示还是隐藏)

stateUnspecified:默认状态。不指定软键盘显示还是隐藏,将由系统选择合适的状态。

stateUnchanged:保留状态。当前界面的软键盘状态,取决于上一个界面的软键盘状态。

stateHidden:隐藏状态。向前导航到当前页面时隐藏软键盘。

stateVisible:显示软键盘。向前导航到当前页面时显示软键盘。上个页面返回时不显示。

stateAlwaysHidden:始终隐藏软键盘 。向前导航到当前页面时隐藏软键盘。

stateAlwaysVisible:始终显示软键盘 。向前导航到当前页面时显示软键盘。上个页面返回时也显示。

注:

stateVisible和stateAlwaysVisible的区别:

  • A页面设置stateVisible,跳转到B页面,B中键盘仍然出现,返回至A时,A中键盘不出现
  • A页面设置stateAlwaysVisible,跳转到B页面,B中键盘仍然出现,返回至A时,A中键盘还会出现

stateHidden和stateAlwaysHidden的区别:

  • 应该是有区别的,只是实践过程中发现效果一致。

(软键盘弹起时状态)

adjustResize:调整 Activity 主窗口的尺寸,重绘,为屏幕上的软键盘腾出空间。

adjustPan:平移窗口内容,以在屏幕上显示焦点项,使用户能看到其输入的内容。

adjustUnspecified:系统根据窗口的内容是否存在任何可滚动其内容的布局视图,自动选择以上其中一种模式。一般,在无滑动的控件上,默认的指定形式为adjustPan,有滑动控件(比如ScrollView控件),则为adjustResize。

adjustNoting: 软键盘弹出时,主窗口不会做出任何反应。

2、设置WindowSoftInputMode的两种方式

(1)在AndroidManifest中设置activity属性android:windowSoftInputMode

(2)在activity的onCreate中代码设置

window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN)

键盘的调出和关闭

    /**
     * 调出键盘
     * view为可见状态的EditText
     **/
    public static void showInput(Context context, View view) {
        InputMethodManager imm = (InputMethodManager) context.getSystemService(INPUT_METHOD_SERVICE);
        if (imm != null) {
            view.requestFocus();
            imm.showSoftInput(view, 0);
        }
    }

    /**
     * 关闭软键盘
     */
    public static void closeKeybord(View view, Context mContext) {
        InputMethodManager imm = (InputMethodManager) mContext.getSystemService(INPUT_METHOD_SERVICE);
        imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
    }

imeOptions与软键盘

日常开发中,有时需要控制软键盘enter键,以及横屏情况下的软键盘显示状态。这就需要用到EditText的imeOptions属性

(1)控制软键盘enter键

  • android:imeOptions=”normal”或android:imeOptions=”actionUnspecified”,默认状态,由系统决定enter键行为(若后面还有输入控件,显示下一项,若无,显示完成)
  • android:imeOptions=”actionNone” 若后面还有输入控件,显示下一项,若无,点击后关闭软键盘
  • android:imeOptions=”actionGo” enter键显示为“前往”,需要自己写事件
  • android:imeOptions=”actionSearch“ enter键显示为“搜索”,需要自己写事件
  • android:imeOptions=”actionSend” enter键显示为“发送”,需要自己写事件
  • android:imeOptions=”actionNext” enter键显示为“下一项”
  • android:imeOptions=”actionPrevious” enter键显示为“上一项”
  • android:imeOptions=”actionDone” enter键显示为“完成”

以上设置需同时设置android:singleLine=”true”才能起效。若不设或为false,点击会换行。

若以上设置,enter键按钮无发生变化,则需要设置android:inputType=“text”,原因可见 ->

imeOptions失效原因

软键盘enter事件监听

        mMainEt = (EditText) findViewById(R.id.edit);
        mMainEt.setOnEditorActionListener(new TextView.OnEditorActionListener() {
            @Override
            public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
                switch (actionId) {
                    //点击GO键
                    case EditorInfo.IME_ACTION_GO:
                        return true;
                    //点击Done
                    case EditorInfo.IME_ACTION_DONE:
                        return true;
                    //点击Next
                    case EditorInfo.IME_ACTION_NEXT:
                        return true;
                    //点击Previous
                    case EditorInfo.IME_ACTION_PREVIOUS:
                        return true;
                    //点击None
                    case EditorInfo.IME_ACTION_NONE:
                        return true;
                    //点击Send
                    case EditorInfo.IME_ACTION_SEND:
                        return true;
                }
                return false;
            }
        });

(2)控制横屏下的软键盘显示状态

android:imeOptions=”flagNoFullscreen|flagNoExtractUi” 软键盘以半屏状态显示

在这里插入图片描述

android:imeOptions=”flagNoAccessoryAction” 软键盘全屏显示,输入框右侧无按钮

在这里插入图片描述

android:imeOptions=”flagNavigatePrevious”或android:imeOptions=”flagNavigateNext”

或android:imeOptions=”flagNoEnterAction” 软键盘全屏显示,如后面仍有输入框,右侧按钮显示下一步,若无,显示完成

在这里插入图片描述

判断键盘是否弹出

private val layoutListener = ViewTreeObserver.OnGlobalLayoutListener {
        if (isKeyboardShown(parent_view)) {//键盘弹出
          } 
}
    
    private fun isKeyboardShown(rootView: View): Boolean {
        val softKeyboardHeight = 100
        val r = Rect()
        rootView.getWindowVisibleDisplayFrame(r)
        val dm = rootView.resources.displayMetrics
        val heightDiff = rootView.bottom - r.bottom
        if (heightDiff > 0) {
            layout_input.visibility = if (showingFeedbackDialog) View.GONE else View.VISIBLE
            val param = layout_input.layoutParams
            param.height = dm.heightPixels - heightDiff
            layout_input.layoutParams = param
            text_input.requestFocus()
        }
        return heightDiff > softKeyboardHeight * dm.density
    }
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

KWMax

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值