软键盘如何隐藏EditText?

20
我有一个布局,使用EditText让用户搜索数据库并将结果展示在ListView中。EditText位于屏幕上方的ImageView之上,其下是一些介绍文字。问题是软键盘会遮挡住EditText,导致用户无法看到自己正在输入什么内容(我已禁用自动建议)。我尝试过LinearLayout、RelativeLayout、填充和不同的对齐方式/居中方式,但仍然无法正常工作。EditText要么被隐藏起来,要么被推出屏幕顶部,或者被“压扁”和扭曲变形。 有任何建议吗?其中一个可能的解决方法是将EditText移到屏幕顶部。但这违背了我所获得的图形设计。另一个可能的解决方法是让软键盘全屏打开(不确定如何操作)。这样做会隐藏EditText,但是我可以重新启用自动建议,以便用户可以看到他正在输入什么内容... 虽然只能看到他正在输入的建议。这是我的最新尝试,请查看“introFrame”。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:layout_width="wrap_content" 
 android:layout_height="fill_parent"
 android:orientation="vertical">

 <LinearLayout android:id="@+id/titleContainer"
  android:orientation="horizontal" android:layout_width="fill_parent"
  android:layout_height="wrap_content">
  <TextView android:text="@string/title_string"
   android:textSize="15sp" android:textColor="#FFFFFF"
   android:textStyle="bold" android:paddingLeft="5dp"
   android:layout_height="fill_parent" android:layout_width="wrap_content" />
 </LinearLayout>

 <FrameLayout 
 android:id="@+id/introFrame"
 android:layout_width="fill_parent" 
 android:layout_height="wrap_content"
 android:gravity="center_horizontal" >
 <ImageView 
  android:src="@drawable/main_search_image"
  android:scaleType="center"
  android:layout_gravity="center"
  android:layout_height="wrap_content"
  android:layout_width="wrap_content"/>
 <LinearLayout
  android:orientation="vertical"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:layout_gravity="center"
  android:paddingTop="140dp" >
  <LinearLayout android:id="@+id/introSearchContainer"
   android:orientation="horizontal" 
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:layout_gravity="center_vertical" >
   <LinearLayout 
    android:orientation="horizontal"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_weight="1" >
    <EditText android:id="@+id/intro_search_box" 
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:hint="     Enter keyword     " 
     android:imeOptions="actionGo"   
     android:inputType="textFilter" 
     android:maxLines="1" />
   </LinearLayout>
   <LinearLayout 
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" >
    <Button android:id="@+id/intro_search_button" 
     android:background="@drawable/custom_button_go"
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" />
    </LinearLayout>
  </LinearLayout>
  <TextView
   android:text="@string/search_intro"
   android:textSize="15sp"
   android:textColor="#FFFFFF"
   android:layout_height="wrap_content"
   android:layout_width="fill_parent" /> 
 </LinearLayout>
 </FrameLayout>

 <LinearLayout android:id="@+id/listContainer"
  android:orientation="vertical" android:layout_width="fill_parent"
  android:layout_height="fill_parent">
  <ListView android:id="@+id/itemlist" android:layout_width="wrap_content"
   android:layout_height="wrap_content" android:cacheColorHint="#00000000" />
  <TextView android:text="No data found" android:layout_width="fill_parent"
   android:layout_height="fill_parent" android:gravity="center"
   android:textSize="16sp" android:textColor="#FFFFFF" android:id="@+id/android:empty" />
 </LinearLayout>

</LinearLayout>

这就是它如何解决我的问题的方法 https://dev59.com/2onca4cB1Zd3GeqP9EsL#29408773 - Rajendra
4个回答

57
你需要查找的是Activity的windowSoftInputMode属性。您可以在AndroidManifest.xml文件中设置此属性,并为其赋值,例如:
  • adjustResize:“始终调整活动的主窗口大小,以便为屏幕上的软键盘腾出空间。”

  • adjustPan:“不会调整活动的主窗口大小,以便为软键盘腾出空间。相反,窗口的内容会自动平移,以使当前焦点永远不会被键盘遮挡,用户始终可以看到他们正在输入的内容。这通常不如调整大小好用,因为用户可能需要关闭软键盘才能访问和与窗口的隐藏部分交互。”
如果您在布局中包含ScrollView,则adjustResize可能适合您。如果您的背景中有位图图像,则它也会被缩放,此时您可能需要改用adjustPan。
<activity android:windowSoftInputMode="adjustResize" />

或者

<activity android:windowSoftInputMode="adjustPan" />

以上链接提供了更多信息。

5
在FragmentActivity的子Fragment中,对我不起作用。 - Bobbelinio
当应用程序在全屏模式下运行时,这将无法正常工作。 - Ashish Sajwan

13

对我而言有效的方法是在一个scrollView中删除我的最高级LinearLayout(ScrollView只能有一个子元素)。这样可以使整个活动/表单向上滚动,而不会混乱聚焦的EditText。

首先,在我的活动中设置:

<activity android:windowSoftInputMode="adjustPan" />

然后我进行了我所说的ScrollView操作:

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

    <!-- STUFF -->

  </LinearLayout>
</ScrollView>

在我的ICS上没用。不知道将stateHidden添加到windowSoftInputMode是否会导致这个问题? - Abhinav Manchanda
作为FragmentActivity的子Fragment,对我不起作用。 - Bobbelinio

3
只需在清单文件中使用以下代码...
  <activity
        android:windowSoftInputMode="adjustPan">

1
尝试给编辑文本设置一个layout_weight(即layout_weight=1),这可能会对您的其他布局项产生一些影响,您可能需要解决这些问题,但这可能有助于在软键盘弹出时保持其可见性。

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