2010-12-13 41 views
20

J'ai une mise en page qui utilise un EditText pour permettre aux utilisateurs de rechercher une base de données et de remplir un ListView. L'EditText est à environ 2/3 du haut de l'écran (positionné sur un ImageView et suivi d'un texte d'introduction.)SoftKeyboard masquage EditText

Le problème est que le clavier logiciel cache l'EditText, donc l'utilisateur peut ' Je vois ce qu'il tape. (J'ai désactivé l'auto-suggestion.)

J'ai essayé LinearLayout, RelativeLayout, paddings et différents alignements/centrages, mais je n'arrive toujours pas à le faire fonctionner correctement. L'EditText est soit caché, soit poussé du haut de l'écran, soit "écrasé" et déformé.

Suggestions ???

Une solution de contournement possible consiste à déplacer l'EditText vers le haut de l'écran. Cependant, cela dévie de la conception graphique qui m'a été donnée.

Une autre solution de contournement possible est pour moi de rendre le clavier virtuel ouvert en plein écran (pas sûr comment, cependant). Cela masquera toujours l'EditText, mais je peux réactiver l'auto-suggestion afin que l'utilisateur puisse voir ce qu'il tape ... en quelque sorte ... car il ne peut voir que les suggestions pour ce qu'il tape.

Voici ma dernière tentative. Voir "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> 
+0

Voici comment cela a résolu mon problème http://stackoverflow.com/a/29408773/3595514 – Rajendra

Répondre

56

Ce que vous cherchez est l'attribut windowSoftInputMode de l'activité. Vous définissez dans votre fichier AndroidManifest.xml, et lui donner une valeur telle que:

  • adjustResize: « la fenêtre principale de l'activité est toujours redimensionnée pour faire de la place pour le clavier virtuel à l'écran. » : "La fenêtre principale de l'activité n'est pas redimensionnée pour faire de la place au clavier virtuel, mais le contenu de la fenêtre est automatiquement agrandi pour que le focus actuel ne soit jamais masqué par le clavier et que les utilisateurs puissent toujours voir ce qui se passe. ils sont en train de taper, ce qui est généralement moins souhaitable que le redimensionnement, parce que l'utilisateur peut avoir besoin de fermer le clavier logiciel pour accéder aux parties obscurcies de la fenêtre et interagir avec elles. AdjustResize fonctionnera probablement pour vous, tant que vous enveloppez la mise en page dans un ScrollView.

Il peut avoir des effets négatifs si vous avez une image bitmap en arrière-plan, car elle sera également redimensionnée, auquel cas vous pouvez utiliser adjustPan à la place.

<activity android:windowSoftInputMode="adjustResize" /> 

ou

<activity android:windowSoftInputMode="adjustPan" /> 

Plus d'informations sont disponibles sur le lien ci-dessus.

+5

ne fonctionne pas pour moi dans un Fragment en tant qu'enfant d'une FragmentActivity. – Bobbelinio

+0

cela ne fonctionne pas lorsque l'application fonctionne en mode plein écran –

1

essayer de donner le modifier le texte d'un layout_weight (c.-à-layout_weight = 1), cela peut avoir d'autres effets sur vos autres éléments de mise en page que vous pourriez avoir à travailler à travers, mais cela peut l'aider à rester visible lorsque le clavier souple pops up

13

Ce qui a fonctionné pour moi est de déposer mon LinearLayout de plus haut niveau dans un scrollView (le ScrollView ne peut avoir qu'un seul enfant). Cela a permis à toute l'activité/formulaire de défiler vers le haut et de ne pas encombrer l'EditText en focus.

D'abord, je mets dans mon activité:

<activity android:windowSoftInputMode="adjustPan" /> 

Je l'ai fait la chose ScrollView je parle:

<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> 
+0

N'a pas fonctionné pour moi sur ICS. Une idée si l'ajout de stateHidden à windowSoftInputMode pourrait être à l'origine de ce problème? –

+0

+1 Enfin! Le 'Scrollview' était la clé pour moi. Merci! – rendon

+0

ne fonctionne pas pour moi dans un Fragment en tant qu'enfant d'une FragmentActivity. – Bobbelinio

2

utiliser juste après dans le manifeste ...

<activity 
     android:windowSoftInputMode="adjustPan">