20

I have a layout that uses an EditText to let users search a database and populate a ListView. The EditText is about 2/3 of the way from the top of the screen (positioned over an ImageView, and followed by some intro text.)

The problem is that the soft keyboard hides the EditText, so the user can't see what he's typing. (I disabled the auto-suggest.)

I've tried LinearLayout, RelativeLayout, paddings, and different alignments/centerings, but I still can't get it to work right. The EditText is either hidden, gets pushed off the top of the screen, or get "squished" and distorted.

Suggestions???

One possible workaround is to move the EditText to the top of the screen. However, this deviates from the graphic design that I was given.

Another possible workaround is for me to make the soft keyboard open in full screen (not sure how, though). This will still hide the EditText, but then I can re-enable the auto-suggestion so the user can see what he's typing... sort of... because he can only see the suggestions for what he's typing.

Here's my latest attempt. See "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>
4

4 回答 4

57

您正在寻找的是 Activity 的windowSoftInputMode属性。你在你的 AndroidManifest.xml 文件中设置它,并给它一个值,例如:

  • adjustResize:“活动的主窗口总是调整大小,以便为屏幕上的软键盘腾出空间。”

  • adjustPan:“活动的主窗口没有调整大小来为软键盘腾出空间。相反,窗口的内容会自动平移,这样当前的焦点就不会被键盘遮挡,用户总是可以看到他们正在输入的内容。这是通常不如调整大小可取,因为用户可能需要关闭软键盘才能到达窗口的模糊部分并与之交互。”

只要您将布局包装在 ScrollView 中,adjustResize 可能对您有用。如果您在背景中有位图图像,它可能会产生负面影响,因为它也会被调整大小,在这种情况下,您可能需要使用 adjustPan。

<activity android:windowSoftInputMode="adjustResize" />

或者

<activity android:windowSoftInputMode="adjustPan" />

更多信息可在上面的链接中找到。

于 2010-12-13T20:16:04.243 回答
13

对我有用的是将我的最高级别 LinearLayout 放在一个滚动视图中(滚动视图只能有一个孩子)。这允许整个活动/表单向上滚动,而不会使焦点中的 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>
于 2012-01-04T22:40:59.547 回答
3

只需在清单中使用以下...

  <activity
        android:windowSoftInputMode="adjustPan">
于 2016-06-01T05:21:45.307 回答
1

尝试给编辑文本一个 layout_weight (ie layout_weight=1) ,这可能会对您可能需要处理的其他布局项目产生一些其他影响,但这可能有助于它在软键盘弹出时保持可见

于 2010-12-13T20:05:12.200 回答