web-dev-qa-db-fra.com

adjustPan n'empêche pas le clavier de couvrir EditText

J'essaie de créer un écran de discussion assez basique avec un ListView affichant le texte et un EditText en bas et un bouton "Envoyer" à droite de EditText. Tout est fonctionnel, mais quand je clique sur EditText, le clavier virtuel le couvre. L'écran se déplace un peu mais pas assez pour devenir visible au-dessus du clavier. J'ai la balise "adjustPan" dans mon manifeste et j'ai également essayé la balise "adjustResize" en vain. Je suppose que cela a quelque chose à voir avec la façon dont ma mise en page est configurée, mais je n'ai honnêtement aucune idée. Aidez-moi!

Disposition actuelle ...

<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>
44
honeal

Après avoir fait beaucoup de recherches, c'est ce que j'appelle un bug. Si vous utilisez la balise plein écran (pour supprimer la barre d'état de l'activité), vous ne pouvez pas utiliser "adjustResize" sans encapsuler l'activité dans un ScrollView. Malheureusement pour moi, j'utilise un ListView qui créerait encore un autre problème. J'en ai marre de jouer avec et j'abandonnerai probablement le plein écran sur cette activité.

49
honeal

Dans votre fichier manifeste, vous devez définir la propriété Android:windowSoftInputMode Appropriée. Cet attribut est valide depuis l'API 3.

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

Les options sont: http://developer.Android.com/guide/topics/manifest/activity-element.html#wsoft

  • stateUnspecified L'état du clavier virtuel (qu'il soit masqué ou visible) n'est pas spécifié. Le système choisira un état approprié ou s'appuiera sur le paramètre du thème. Il s'agit du paramètre par défaut pour le comportement du clavier virtuel.
  • stateUnchanged Le clavier virtuel est conservé dans l'état dans lequel il se trouvait, qu'il soit visible ou masqué, lorsque l'activité est mise en évidence.
  • "stateHidden" Le clavier virtuel est masqué lorsque l'utilisateur choisit l'activité - c'est-à-dire lorsque l'utilisateur navigue affirmativement vers l'activité, plutôt que vers l'arrière à cause de quitter une autre activité.
  • stateAlwaysHidden Le clavier virtuel est toujours masqué lorsque la fenêtre principale de l'activité a le focus d'entrée.
  • stateVisible Le clavier virtuel est visible lorsqu'il est normalement approprié (lorsque l'utilisateur navigue vers la fenêtre principale de l'activité).
  • stateAlwaysVisible Le clavier virtuel est rendu visible lorsque l'utilisateur choisit l'activité - c'est-à-dire lorsque l'utilisateur navigue affirmativement vers l'activité, plutôt que d'y revenir à cause de quitter une autre activité.
  • adjustUnspecified Il n'est pas spécifié si la fenêtre principale de l'activité se redimensionne pour faire de la place pour le clavier virtuel, ou si le contenu du volet de la fenêtre pour rendre visible le focus actuel À l'écran. Le système sélectionnera automatiquement l'un de ces modes selon que le contenu de la fenêtre a des vues de disposition pouvant faire défiler leur contenu. S'il existe une telle vue, la fenêtre sera redimensionnée, en supposant que le défilement peut rendre tout le contenu de la fenêtre visible dans une zone plus petite. Il s'agit du paramètre par défaut pour le comportement de la fenêtre principale.
  • adjustResize La fenêtre principale de l'activité est toujours redimensionnée pour faire de la place pour le clavier virtuel à l'écran.
  • adjustPan La fenêtre principale de l'activité n'est pas redimensionnée pour faire de la place au clavier virtuel. Au contraire, le contenu de la fenêtre est automatiquement balayé afin que le focus actuel ne soit jamais masqué par le clavier et que les utilisateurs puissent toujours voir ce qu'ils tapent. Ceci est généralement moins souhaitable que le redimensionnement, car l'utilisateur peut avoir besoin de fermer le clavier virtuel pour accéder et interagir avec les parties masquées de la fenêtre.
29
LocalPCGuy

si vous définissez Android:windowSoftInputMode="adjustResize" pour une activité dans le manifeste, puis un ScrollView (ou d'autres ViewGroups repliables) se rétrécira pour accueillir le clavier virtuel. Mais si vous définissez Android:windowFullscreen="true" dans le thème de l'activité, le ScrollView ne diminuera pas car il est forcé de remplir tout l'écran. Cependant, la définition de Android:fitsSystemWindows="false" dans votre thème empêche également adjustResize de fonctionner

9
BadYous

Je l'avais dans mon AndroidManifest. Cela a causé le adjustPan de cesser de fonctionner correctement. J'ai supprimé le bloc ci-dessous et tout fonctionne à nouveau correctement.

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

Voici une solution de contournement que j'ai trouvée. Ouvrez le editText problématique et appuyez sur la touche RETOUR. Notez qu'il déplace le editText plus près de la position pour laquelle vous photographiez.

Donc, bien que hacky, vous pouvez essentiellement plaire à une nouvelle ligne en haut de l'edittext.

Cela semble également fonctionner en utilisant une nouvelle ligne en bas, mais vous devrez utiliser un délai pour ne pas ajouter la nouvelle ligne jusqu'à ce qu'APRÈS que le clavier virtuel se soit animé en position.

Remarque Je n'ai ce problème que sur certains téléphones (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());
                }
            });
        }
0
paulpooch