欢迎访问宙启技术站
智能推送

解决 Android 软键盘挡住输入框的问题

发布时间:2023-05-18 19:04:00

在 Android 系统中,当用户点击一个输入框时,系统会弹出软键盘供用户输入。然而,有时软键盘会挡住输入框,影响用户输入体验。本文将介绍如何解决 Android 软键盘挡住输入框的问题。

1. ScrollView

在一个带有输入框的布局中,可以将它们放在 ScrollView 内。这样当软键盘弹出时,ScrollView 会自动调整布局,使得输入框可见,并且用户可以通过滑动屏幕来更改输入框的位置。

2. adjustPan

Android 系统提供了一个属性叫做 android:windowSoftInputMode,它可以控制软键盘的行为。其中,值为 adjustPan 表示系统将会把 Activity 的主界面向上滚动,以展示输入框。通过在 AndroidManifest.xml 文件中设置该属性,以达到软键盘不挡住输入框的效果。

<activity
    android:name=".MainActivity"
    android:windowSoftInputMode="adjustPan">
</activity>

3. adjustResize

另一个可选的属性是 adjustResize,它会调整布局的大小,以便软键盘不挡住输入框。使用这个属性,输入框将保持可见,而其他的内容将被调整以适应屏幕。

<activity
    android:name=".MainActivity"
    android:windowSoftInputMode="adjustResize">
</activity>

需要特别注意的是,在使用 adjustResize 属性时,如果你的布局中包含有 ScrollView,ListView,RecyclerView 等可滚动的视图,可能会因为软键盘的占用使得内容缩短,并且无法完整展示。

4. 弹出软键盘时自动滑动输入框到视图顶部

除了上述的解决方案,也可以在代码中监听软键盘弹出事件,自动将输入框移动到视图顶部。具体实现如下:

public class MainActivity extends AppCompatActivity {

    private EditText editText;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        editText = findViewById(R.id.edit_text);

        // 监听软键盘弹出事件
        getWindow().getDecorView().getViewTreeObserver().addOnGlobalLayoutListener(
                new ViewTreeObserver.OnGlobalLayoutListener() {
                    @Override
                    public void onGlobalLayout() {
                        Rect rect = new Rect();
                        getWindow().getDecorView().getWindowVisibleDisplayFrame(rect);
                        int screenHeight = getWindow().getDecorView().getHeight();
                        int keyboardHeight = screenHeight - rect.bottom;
                        if (keyboardHeight > 0) {
                            // 软键盘弹出,将输入框滑动到屏幕顶部
                            int[] location = new int[2];
                            editText.getLocationOnScreen(location);
                            int offset = location[1] + editText.getHeight() - screenHeight;
                            if (offset > 0) {
                                findViewById(android.R.id.content).scrollBy(0, offset);
                            }
                        } else {
                            // 软键盘收起,将输入框滑动回原来的位置
                            findViewById(android.R.id.content).scrollTo(0, 0);
                        }
                    }
                });
    }
}

以上是解决 Android 软键盘挡住输入框的几种方法,在实际开发中可以根据不同的情况选择合适的解决方案来解决问题。