adjustPan不会阻止键盘覆盖EditText

时间:2010-12-29 23:33:54

标签: android android-layout android-manifest android-softkeyboard

我正在尝试创建一个非常基本的聊天屏幕,其中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 个答案:

答案 0 :(得分:49)

经过大量搜索后,显然这就是我所说的错误。如果使用全屏标记(从活动中删除状态栏),则不能使用“adjustResize”而不将活动包装在ScrollView中。不幸的是,我正在使用ListView,这将产生另一个问题。我厌倦了搞乱它,可能只是放弃了那个活动的全屏。

答案 1 :(得分:29)

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

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

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

  • stateUnspecified 未指定软键盘的状态(无论是隐藏还是可见)。系统将选择适当的状态或依赖主题中的设置。 这是软键盘行为的默认设置。
  • stateUnchanged 当活动脱颖而出时,软键盘将保持最后的状态,无论是可见的还是隐藏的。
  • “stateHidden”当用户选择活动时,软键盘会被隐藏 - 也就是说,当用户肯定地向前导航到活动时,而不是因为离开其他活动而退回到活动中。 / LI>
  • stateAlwaysHidden 当活动的主窗口具有输入焦点时,软键盘始终处于隐藏状态。
  • stateVisible 软键盘在通常合适时(当用户导航到活动的主窗口时)可见。
  • stateAlwaysVisible 当用户选择活动时,即当用户肯定地向前导航到活动时,软键盘可见,而不是因为离开另一个活动而退回到活动中。 LI>
  • adjustUnspecified 未指定活动的主窗口是否调整大小以便为软键盘腾出空间,或窗口内容是否平移以使当前焦点在屏幕上可见。系统将根据窗口内容是否具有可滚动其内容的任何布局视图自动选择其中一种模式。如果存在这样的视图,则窗口将被调整大小,假设滚动可以使所有窗口的内容在较小的区域内可见。 这是主窗口行为的默认设置。
  • adjustResize 活动的主窗口始终调整大小,以便为屏幕上的软键盘腾出空间。
  • adjustPan 活动的主窗口未调整大小以便为软键盘腾出空间。相反,窗口的内容会自动平移,以便键盘不会遮挡当前焦点,用户可以随时看到他们正在键入的内容。这通常不如调整大小,因为用户可能需要关闭软键盘才能进入并与窗口的模糊部分进行交互。

答案 2 :(得分:9)

如果为清单中的活动设置android:windowSoftInputMode="adjustResize",则ScrollView(或其他可折叠的ViewGroups)将缩小以容纳软键盘。但是,如果在活动的主题中设置android:windowFullscreen="true",则ScrollView不会缩小,因为它被强制填满整个屏幕。但是,在主题中设置android:fitsSystemWindows="false"也会导致adjustResize无法正常工作

答案 3 :(得分:1)

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

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

答案 4 :(得分:0)

这是我找到的一种解决方法。打开有问题的editText并按RETURN键。请注意,它会将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());
                }
            });
        }

答案 5 :(得分:0)

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

答案 6 :(得分:-13)

您可以尝试以下设置:

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