web-dev-qa-db-fra.com

Adjustpan Android ne fonctionne pas après la première fois

Mon problème: à partir de la deuxième fois que le clavier du logiciel est affiché à l'écran, il cache entièrement mon EditText. 

L'attribut Android: windowSoftInputMode = "adjustPan" a été spécifié dans le fichier AndroidManifest.xml, mais il ne fonctionne que la première fois.

J'ai la disposition suivante:

 <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:tools="http://schemas.Android.com/tools"
    Android:layout_width="match_parent"
    Android:layout_height="fill_parent"
    Android:orientation="vertical" >

    <LinearLayout
        Android:layout_width="match_parent"
        Android:layout_height="464dp"
        Android:gravity="top"
        Android:orientation="vertical"
        Android:paddingLeft="16dp"
        Android:paddingRight="16dp" >

        <ListView
            Android:id="@+id/list"
            Android:layout_width="match_parent"
            Android:layout_height="0dp"
            Android:layout_weight="10"
            Android:background="#E3E3E2"
            Android:gravity="top" />

        <LinearLayout
            Android:layout_width="match_parent"
            Android:layout_height="wrap_content"
            Android:orientation="horizontal" >

            <EditText
                Android:id="@+id/addListText"
                Android:layout_width="0dp"
                Android:layout_height="48dp"
                Android:layout_weight="10"
                Android:contentDescription="@string/addItemContentDescription"
                Android:gravity="bottom|center_horizontal"
                Android:inputType="textLongMessage"
                Android:textColor="#E3E3E2"
                Android:visibility="gone" />

            <ImageButton
                Android:id="@+id/addTextListButton"
                Android:layout_width="0dp"
                Android:layout_height="48dp"
                Android:layout_weight="1"
                Android:layout_gravity="right"
                Android:background="@Android:color/transparent"
                Android:contentDescription="@string/addItemButton"
                Android:scaleType="fitCenter"
                Android:src="@drawable/plus_add"
                Android:visibility="gone" />
        </LinearLayout>
    </LinearLayout>

    <LinearLayout
        Android:layout_width="match_parent"
        Android:layout_height="fill_parent"
        Android:gravity="bottom|center_horizontal"
        Android:orientation="horizontal"
        Android:paddingLeft="16dp"
        Android:paddingRight="16dp" >

        <ImageButton
            Android:id="@+id/syncListsButton"
            Android:layout_width="64dp"
            Android:layout_height="match_parent"
            Android:src="@Android:drawable/ic_popup_sync" />

        <ImageButton
            Android:id="@+id/showOrHide"
            Android:layout_width="64dp"
            Android:layout_height="match_parent" />

        <ImageButton
            Android:id="@+id/delListButton"
            Android:layout_width="64dp"
            Android:layout_height="match_parent"
            Android:src="@Android:drawable/ic_menu_delete" />
    </LinearLayout>
</LinearLayout>

Le bouton "showOrHide" affiche/masque le combo "addListText"/"addTextListButton".

Lorsque le texte d'édition est affiché pour la première fois et que je le touche, le clavier logiciel apparaît à l'écran et le combo "addListText"/"addTextListButton" est affiché correctement. Quand je cache le clavier et que je le montre à nouveau, le clavier couvre complètement ma boîte de saisie addListText!

Une idée sur ce qui se passe? Je le teste sur Android 4.2.2.

S'il vous plaît aider! Merci :-)

edit: J'ai également essayé de placer le premier LinearLayout dans un ScrollView mais cela ne fonctionne pas!

39
bilbo20

sous-classe EditText et substitué la méthode onKeyPreIme (int keyCode, événement KeyEvent) comme ceci:

   @Override
   public boolean onKeyPreIme(int keyCode, KeyEvent event)
   {
      if(keyCode == KeyEvent.KEYCODE_BACK)
        {
            clearFocus();
        }
   return super.onKeyPreIme(keyCode, event);
   }

Désormais, lorsque vous appuyez sur la touche Précédent, l’EditText a perdu le focus. Ensuite, appuyez à nouveau sur ce bouton pour ajuster.

53
Chirag Shah

Cela peut sembler un peu ridicule, mais je me suis heurté à ce problème en réglant la densité de propriété de mon EditText sur 'center_horizontal' ou 'center'. Le même problème se produit lors de l'utilisation de textAlignment 'center'. Supprimez-le et vous ne rencontrerez pas le problème du clavier masquant l'EditText la deuxième fois (et les suivantes) lorsque le clavier sortira.

79
dbar

Le problème que vous rencontrez est maintenant un bogue de plate-forme connu, comme décrit ici: https://code.google.com/p/Android/issues/detail?id=182191

Le correctif n'est pas rétroporté et ne prendra donc effet qu'après Android N. Jusqu'à ce qu'Android N soit votre SDK minimum, la solution suivante constitue une solution de contournement.

Vous pouvez créer une classe personnalisée qui étend EditText et redéfinir la méthode onKeyPreIme (int keyCode, événement KeyEvent) comme suit:

@Override
public boolean onKeyPreIme(int keyCode, KeyEvent event)
{
   if(keyCode == KeyEvent.KEYCODE_BACK)
     {
         clearFocus();
     }
return super.onKeyPreIme(keyCode, event);
}

Vous devez également vous assurer qu'une mise en page de niveau supérieur a la capacité d'être focalisée afin que la focalisation de EditText puisse être effacée avec succès. Les attributs suivants peuvent fonctionner pour vous:

Android:descendantFocusability="beforeDescendants"
Android:focusableInTouchMode="true"

Désormais, lorsque vous appuyez sur la touche Précédent, l’EditText perd la focalisation. Ensuite, lorsque vous appuyez de nouveau sur le bouton, adjustpan fonctionnera comme prévu . (Publication en tant que réponse, la modification ayant été refusée.)

9
colintheshots

Voici le code que j'utilisais à l'origine qui a rencontré ce problème:

    <EditText
        Android:layout_width="250dp"
        Android:layout_height="wrap_content"
        Android:gravity="center" />

Lorsque j'ai supprimé la ligne de gravité centrale de EditText, le panoramique a fonctionné:

Android:gravity="center"

J'ai résolu le problème en encapsulant EditText dans un FrameLayout et en centrant l'intégralité de EditText dans FrameLayout. Le seul problème que cela cause est que EditText sera au moins la largeur du texte codé, donc les premiers caractères/mots tapés ne seront pas centrés. C'était bien pour moi, mais votre kilométrage peut varier :)

<FrameLayout
    Android:layout_width="250dp"
    Android:layout_height="wrap_content">

    <EditText
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:layout_gravity="center" />
</FrameLayout>

EDIT: cette solution de contournement est rompue si l'utilisateur clique sur le dernier mot de l'edittext. J'utilise maintenant la solution de contournement onKeyPreIme

1
Mihai

Pour moi, remplacer onKeyPreIme ne fonctionne pas. Donc, je remplace dispatchKeyEventPreIme à la place.

@Override
public boolean dispatchKeyEventPreIme(KeyEvent event) {
    if(event.getKeyCode() == KeyEvent.KEYCODE_BACK){
     clearFocus();
    }
    return super.dispatchKeyEventPreIme(event);
}

Après avoir essayé beaucoup de solutions dans le fichier manifeste,

Votre mise en page parent doit être LinearLayout

J'espère que cela fait gagner du temps aux gens.

0
Rishabh Dugar

Habituellement, le réglage panoramique ne fonctionne pas après la première utilisation du bouton Précédent. Essayez de procéder de la manière suivante: - (peut être implémenté pour EditText, AutoCompleteTextView ou toute autre vue dans laquelle se comporte mal)

 @Override
    public void onBackPressed() {
        editText.clearFocus();
        editText.setCursorVisible(false);
    }

J'espère que ça aide quelqu'un

0
cammando

Dans EditText Android:layout_gravity="center" Créez ce type de problème. Si vous voulez que le texte devienne au centre, vous pouvez le faire de cette façon 

Étape 1: pour la mise en page 

 <LinearLayout
                Android:id="@+id/linerPassword"
                Android:layout_width="match_parent"
                Android:layout_height="wrap_content"
                Android:layout_toRightOf="@+id/imageView2"
                Android:gravity="center">

                <EditText
                    Android:id="@+id/editText2"
                    Android:layout_width="wrap_content"
                    Android:layout_height="40dp"
                    Android:background="@null"
                    Android:hint="*****"
                    Android:layout_marginLeft="-40dp"
                    Android:paddingLeft="10dp"
                    Android:paddingRight="10dp"
                    Android:inputType="textPassword"
                    Android:textColor="@color/white"
                    Android:textColorHint="@color/white"
                    Android:textSize="18sp" />
            </LinearLayout>

step2: Quelque chose par programme

 linerUser.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
            imm.showSoftInput(mETUserName, 0);
            mETUserName.requestFocus();    
        }
    });

Enfin, fonctionne très bien. J'ai trouvé cette solution pour ajuster softKeyboard

0
Binesh Kumar