adjustPan不能防止键盘覆盖EditText。

46
我正在尝试创建一个相当基础的聊天屏幕,其中包含一个显示文本的ListView和位于底部的EditText以及右侧的“发送”按钮。一切都能够正常工作,但是当我点击EditText时,虚拟键盘会覆盖它。屏幕会向上滚动一点点,但不足以使EditText在键盘上方可见。我已经在清单文件中添加了“adjustPan”标签,并尝试过“adjustResize”标签,但都没有用。我猜想这可能与我的布局设置有关,但是实际上我完全不知道。请帮忙!

当前布局...

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">

<ListView android:id="@+id/android:list" 
    android:layout_height="0dip" 
    android:layout_width="fill_parent"
    android:layout_weight="1"
    android:stackFromBottom="true">
</ListView>

<LinearLayout android:orientation="horizontal"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content">

    <EditText android:id="@+id/sendMessageBox"
        android:focusable="true"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:scrollbars="vertical"
        android:maxLines="4"
        android:text=""
        android:inputType="textShortMessage|textAutoCorrect|textCapSentences|textMultiLine"
        android:maxLength="1000"
        android:hint="Type your message..."
        android:imeOptions="actionSend"/>

    <Button android:id="@+id/sendMessageButton" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content"
        android:layout_gravity="bottom"
        android:text="Send"/>

</LinearLayout>

7个回答

54

经过大量搜索,显然这是我所说的一个 bug。如果使用全屏标记(从活动中删除状态栏),则无法使用 "adjustResize",除非在 ScrollView 中包装该活动。不幸的是,我正在使用 ListView,这将创建另一个问题。我已经厌倦了这个问题,可能会放弃在该活动中使用全屏。


谢谢!救了我的一天!我的 webview 输入框被键盘覆盖了。移除全屏解决了这个问题。 - tarkeshwar
2
谢谢!我也遇到了同样的问题,但将所有内容放在scrollView中也没有解决问题。因此,似乎移除全屏标志是摆脱这个错误的唯一方法。 - yahya
请查看下面 @usman 的简单答案。适用于全屏。 - M. Usman Khan
我也尝试去掉全屏,但是没有成功。有什么想法吗? - Dani
禁用全屏幕确实是一件好事。请确保不要做以下操作: window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);另一个是 android:windowSoftInputMode="adjustResize" - Bundeeteddee

31

在您的清单文件中,您需要设置适当的android:windowSoftInputMode属性。此属性自API 3以来有效。

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

选项包括:http://developer.android.com/guide/topics/manifest/activity-element.html#wsoft

  • stateUnspecified 软键盘的状态(隐藏或显示)未指定。系统将选择适当的状态或依赖于主题设置。这是软键盘行为的默认设置。
  • stateUnchanged 软键盘保持在上一次状态下,无论是显示还是隐藏,当活动进入前台时。
  • "stateHidden" 当用户确认导航到该活动时,即当用户前往活动而不是因离开另一个活动而返回时,软键盘被隐藏。
  • stateAlwaysHidden 当活动的主窗口具有输入焦点时,软键盘始终处于隐藏状态。
  • stateVisible 当用户导航到活动的主窗口时,软键盘可见。
  • stateAlwaysVisible 当用户确认导航到该活动时,即当用户前往活动而不是因离开另一个活动而返回时,软键盘将被显示。
  • adjustUnspecified 活动的主窗口是否调整大小以腾出空间来放置软键盘,或者窗口内容是否滚动以使当前焦点可见。系统将根据窗口的布局视图中是否存在可滚动其内容的视图来自动选择其中一种模式。如果存在此类视图,则窗口将被调整大小,假定滚动可以在较小的区域内使窗口的所有内容可见。这是主窗口行为的默认设置。
  • adjustResize 活动的主窗口始终会调整大小以便于在屏幕上显示软键盘。
  • adjustPan 活动的主窗口不会调整大小以便于在屏幕上显示软键盘。相反,窗口的内容将自动平移,以便于当前焦点不被键盘遮挡,用户始终可以看到他们正在输入的内容。这通常比调整大小更不理想,因为用户可能需要关闭软键盘才能访问和操作窗口的遮挡部分。

这对我有用。将windowSoftInputMode放入布局中并没有起作用。由于我已经在另一个视图中声明了android:fitsSystemWindows="true",所以我无法将其放置在需要它工作的布局中。谢谢! - Tyler
如何调整pan比调整resize更不理想。 调整大小会使布局中的整个品牌形象混乱..请解释。 - Siddharth
那个措辞(不太理想)直接来自于Android指南,而且在那个句子的其余部分列出了原因——“...因为用户可能需要关闭软键盘才能访问和与窗口中被遮挡的部分进行交互。”在我看来,将品牌推广置于良好的用户体验之上并不是一个好主意,尽管不幸的是这种情况经常发生。 - LocalPCGuy

9
如果您在清单文件中为一个活动设置android:windowSoftInputMode="adjustResize",那么ScrollView(或其他可折叠的ViewGroups)将会缩小以适应软键盘。但是,如果您在活动主题中设置了android:windowFullscreen="true",那么ScrollView不会缩小,因为它被强制填充整个屏幕。然而,在您的主题中设置android:fitsSystemWindows="false"也会导致adjustResize无法工作。

非常感谢您的澄清,我已经苦恼了几天,因为我在我的应用程序中使用全屏模式。谢谢! - Faisal Naseer

1

我在AndroidManifest中有这个内容。它导致了adjustPan停止正常工作。我删除了下面的代码块,现在一切都正常了。

<supports-screens
        android:smallScreens="true"
        android:normalScreens="true"
        android:largeScreens="true"
        android:xlargeScreens="false"
        android:anyDensity="false" />

我已经得到了它,但我正在尝试将其删除,但我不知道它是从哪里生成的。我的config.xml中没有任何对此的引用。 - Dani
这个问题已经有几年了,但我认为上面的代码在我的AndroidManifest.xml文件中。 - JeffRegan
我无法编辑此文件,我需要更改生成另一个文件的config.xml,但我没有这个文件。但是不管怎样,从AndroidManifest.xml 中删除它也不起作用,但不用担心,这已经很旧了。 - Dani

0

这里是我找到的一个解决方法。打开有问题的editText并按回车键。注意它会将editText移动到你想要的位置。

虽然有点hacky,但你可以在edittext顶部插入一个换行符。

这也似乎适用于在底部使用换行符,但你必须使用延迟,直到软键盘动画到位后再添加换行符。

请注意,我只在某些手机上(DroidX)遇到了这个问题。

if (android.os.Build.MODEL.equals("DROIDX")) {
        inputEt.setOnFocusChangeListener(new OnFocusChangeListener() {
            @Override
            public void onFocusChange(View v, boolean hasFocus) {
                    String text = inputEt.getText().toString();
                    text = "\n\n" + text.trim();
                    inputEt.setText(text);  
                    inputEt.setSelection(text.length());
                }
            });
        }

-2

尝试在您的清单文件中添加android:windowSoftInputMode="adjustResize|stateVisible|stateAlwaysHidden"


-15

你可以尝试以下设置:

<supports-screens
android:anyDensity="true"/>

答案错误。请更正此答案。 - IntelliJ Amiya

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接