36

Mon problème: à partir du deuxième affichage du clavier logiciel sur l'écran, il masque entièrement mon EditText.Le réglage Android ne fonctionne pas après la première fois

Attribut android: windowSoftInputMode = "adjustPan" a été spécifié dans le fichier AndroidManifest.xml, mais cela 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" afficher/masquer le combo "addListText"/"addTextListButton". Lorsque le texte EditText est affiché pour la première fois et que je le touche, le clavier virtuel apparaît à l'écran et le combo "addListText"/"addTextListButton" est correctement positionné. Quand je cache le clavier et que je le montre à nouveau, le clavier couvre complètement ma boîte d'édition addListText!

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

Aidez s'il vous plaît! Merci :-)

edit: J'ai aussi essayé de mettre le premier LinearLayout dans un ScrollView mais ça ne marche pas!

Répondre

52

EditText et réécrite sous-classé la méthode onKeyPreIme (int codeTouche, événement KeyEvent) comme ceci:

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

Maintenant, lorsque la touche arrière est enfoncée, le EditText a perdu le focus. Puis en tapant à nouveau sur adjustpan, cela fonctionnera.

+0

merci, cela a fonctionné pour moi! – bilbo20

+0

Quel truc! – MKJParekh

+0

tnx .. @ MKJParekh –

76

Cela peut sembler un peu idiot mais j'ai rencontré ce problème lorsque j'ai défini la gravité 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'. Retirez-le et vous ne rencontrerez pas le problème du clavier cachant le EditText la deuxième fois (et les suivants) lorsque le clavier sort.

+5

Incroyable! Et incroyable, je veux dire, il est incroyable de voir comment des choses apparemment sans rapport peuvent déranger les choses dans Android. – Medo

+6

Quel bug ridicule .... Merci de réaliser cela bien ... – Sakiboy

+0

Vous me sauvez la vie, merci – jlopez

1

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

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

Lorsque j'ai enlevé la ligne de gravité du centre de la EditText, le balayage panoramique travaillé:

android:gravity="center" 

Je CONTOURNÉS En enveloppant le EditText dans un FrameLayout et en centrant le EditText entier dans le FrameLayout. Le seul problème que cela provoque est que EditText aura au moins la largeur du texte hinttext, de sorte que 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 casse si l'utilisateur est en cliquant sur le dernier mot dans le edittext. J'utilise maintenant la solution de contournement de onKeyPreIme

8

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

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

Vous pouvez créer une classe personnalisée extension EditText et remplacer la méthode onKeyPreIme (int codeTouche, événement KeyEvent) comme ceci:

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

Vous devez également vous assurer une mise en page de niveau supérieur a la capacité de se concentrer si la Le focus d'EditText peut être effacé avec succès. Les attributs suivants peuvent fonctionner pour vous:

android:descendantFocusability="beforeDescendants" 
android:focusableInTouchMode="true" 

Maintenant que vous appuyez sur la touche de retour, l'EditText perd le focus. Ensuite, lorsque vous appuyez à nouveau sur le bouton, l'ajustement fonctionnera comme prévu. (Publication en tant que réponse car l'édition a été refusée.)

0

Dans EditText android:layout_gravity="center" Créez ce type de problème. Si vous voulez devenir texte dans le centre, alors vous pouvez le faire de cette façon

Etape 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> 

Etape 2: Quelque chose par programatically

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 très bien. J'ai trouvé cette solution pour ajuster softKeyboard

1

Pour moi l'annulation 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); 
} 
+0

cela a fonctionné pour moi! Merci!! – xbadal

0

Habituellement, le régler panoramique ne fonctionne pas après la première fois quand on appuie sur le bouton de retour essayer de le faire comme suit: - (peut être mis en œuvre pour le EditText, AutoCompleteTextView ou tout autre point de vue dans lequel se comporte mal)

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

il aide quelqu'un Espoir

0

Après avoir essayé de nombreuses solutions dans le fichier Manifest, je l'ai résolu par ci-dessous, adjustPan avec la disposition relative ne fonctionne pas,

Votre disposition parent doit être LinearLayout

Espère que cela économise du temps pour les personnes.

Questions connexes