处理输入法可见性

当输入焦点移入或移出可编辑的文本字段时,Android 会根据具体情况显示或隐藏输入法(例如屏幕键盘)。系统还会决定界面和文本字段在输入法上方的显示方式。例如,当屏幕上的垂直空间受到约束时,文本字段可能会填满输入法上方的所有空间。对于大多数应用而言,这些默认行为就是全部所需。

但在某些情况下,您可能需要更直接地控制输入法的可见性,并指定当输入法可见时您希望布局具有的外观。本节课将介绍如何控制和响应输入法可见性。

在 Activity 启动时显示输入法

虽然 Android 会在 Activity 启动时将焦点移至布局中的第一个文本字段,但它不会显示输入法。此行为是恰当的,因为输入文本可能不是 Activity 中的主要任务。但是,如果输入文本确实是主要任务(例如在登录屏幕中),那么您可能希望默认显示输入法。

如需在 Activity 启动时显示输入法,请将 android:windowSoftInputMode 属性添加到值为 "stateVisible"<activity> 元素中。例如:

    <application ... >
        <activity
            android:windowSoftInputMode="stateVisible" ... >
            ...
        </activity>
        ...
    </application>
    

注意:如果用户的设备连接了硬件键盘,则不会显示软输入法。

根据需要显示输入法

如果 Activity 的生命周期中有一个方法,您希望为其确保输入法是可见的,则可以使用 InputMethodManager 来显示它。

例如,以下方法接受 View(用户应在其中输入内容),调用 requestFocus() 使其成为焦点,然后调用 showSoftInput() 以打开输入法:

Kotlin

    fun showSoftKeyboard(view: View) {
        if (view.requestFocus()) {
            val imm = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
            imm.showSoftInput(view, InputMethodManager.SHOW_IMPLICIT)
        }
    }
    

Java

    public void showSoftKeyboard(View view) {
        if (view.requestFocus()) {
            InputMethodManager imm = (InputMethodManager)
                    getSystemService(Context.INPUT_METHOD_SERVICE);
            imm.showSoftInput(view, InputMethodManager.SHOW_IMPLICIT);
        }
    }
    

注意:输入法显示后,您不应以编程方式将其隐藏。当用户完成文本字段中的任务时,系统会隐藏输入法,或者用户可以使用系统控件(例如使用“返回”按钮)隐藏输入法。

指定界面的响应方式

当输入法出现在屏幕上时,它会减少应用界面的可用空间。系统会决定应如何调整界面的可见部分,但可能操作不正确。为了确保应用具有最佳行为,您应该指定希望系统如何在剩余空间中显示界面。

如需在 Activity 中声明您的首选处理方式,请使用清单的 <activity> 元素中的 android:windowSoftInputMode 属性,该属性包含其中一个“adjust”值。

例如,要确保系统将布局大小调整为可用空间,以确保所有布局内容均可访问(尽管可能需要滚动),请使用 "adjustResize"

    <application ... >
        <activity
            android:windowSoftInputMode="adjustResize" ... >
            ...
        </activity>
        ...
    </application>
    

您可以将调整规范与上述初始输入法可见性规范结合使用:

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

如果您的界面包含用户可能需要在执行文本输入期间或之后立即访问的控件,则指定 "adjustResize" 非常重要。例如,如果您使用相对布局将按钮栏放置在屏幕底部,则使用 "adjustResize" 可调整布局大小,使按钮栏显示在输入法上方。