Android 键盘只出现一次,但当我删除 ListView 时键盘工作正常

Android keyboard only shows up once, but works perfectly when I remove the ListView

当前行为

使用下面的 xml 布局,EditText 的 android 键盘会在 activity 启动时立即显示。如果我退出键盘,触摸 EditText 不会使键盘恢复原状。

期望的行为

当我注释掉下面的 ListView 时,一切正常。 android 键盘不会立即为 EditText 弹出,而是仅在我按下它时弹出。我还可以通过触摸 EditText 来恢复键盘。

问题

  1. 为什么我有 ListView 时会出现意外行为?
  2. 如何保持 ListView 和所需的行为?

旁注

在这两种情况下,我都注释掉了处理 ListView 的所有 Java 代码,因此这不是编程问题。 当我单击后退按钮,然后返回此 activity 时,键盘再次弹出(当 ListView 被注释掉时)。

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.mywebsite.myproject.PrivateChat" >

<RelativeLayout
    android:id="@+id/form"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true"
    android:layout_alignParentLeft="true"
    android:orientation="vertical" >

    <EditText
        android:id="@+id/message_input_box"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginRight="10dp"
        android:layout_marginTop="5dp"
        android:background="#333333"
        android:hint="Type a message..."
        android:textColorHint="#FFFFFF"
        android:inputType="text"
        android:paddingLeft="5dp"
        android:paddingRight="5dp"
        android:paddingTop="4dp"
        android:paddingBottom="4dp"
        android:textColor="#FFFFFF"
        android:textSize="26sp" />

</RelativeLayout>

<ListView
    android:id="@+id/private_chat_list_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_alignParentTop="true" >
</ListView>

</RelativeLayout>

我只用了两行xml.

就修复了

我将这一行添加到 AndroidManifest.xml 中的 activity:

android:windowSoftInputMode="stateAlwaysHidden" 

我将这一行添加到 ListView:

android:layout_above="@id/form"

为什么这样有效

我感觉 ListViews 自动调出软键盘存在错误。添加第一行 xml 时,它阻止了键盘自动弹出。根据文档,所有这一切都是 The soft keyboard is always hidden when the activity's main window has input focus. 换句话说,如果主要 window 具有焦点,则此行可能有效的唯一方法,因此它很可能是 ListViews 的错误。对不起,我没有更具体的解释。

第二行很直观。 ListView 占据了整个屏幕,因为我将其高度设置为 match_parent。因此它覆盖了 EditText,这就是为什么我不能再次按下 EditText 来恢复键盘。为了阻止 ListView 与 EditText 重叠,我只是将 ListView 锚定在 EditText 上方(远高于包含 EditText 的 RelativeLayout 但这不是重点)。