242 votes

HOWTO capture le ' clavier virtuel afficher/masquer ' événement dans Android ?

Je voudrais changer la disposition en fonction de si le clavier virtuel est visible ou pas. J’ai cherché l’API et différents blogs mais n’arrive pas à trouver quelque chose d’utile.

Est-ce possible ?

Merci !

77voto

Pedro Loureiro Points 6889

Vous avez à gérer les changements de configuration vous-même.

http://developer.android.com/guide/topics/resources/runtime-changes.html#HandlingTheChange

Exemple:

// from the link above
@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);


    // Checks whether a hardware keyboard is available
    if (newConfig.hardKeyboardHidden == Configuration.HARDKEYBOARDHIDDEN_NO) {
        Toast.makeText(this, "keyboard visible", Toast.LENGTH_SHORT).show();
    } else if (newConfig.hardKeyboardHidden == Configuration.HARDKEYBOARDHIDDEN_YES) {
        Toast.makeText(this, "keyboard hidden", Toast.LENGTH_SHORT).show();
    }
}

Alors il suffit de changer la visibilité de certains points de vue, mettre à jour un champ, et de modifier votre fichier de mise en page.

Note

Cette solution ne fonctionne pas pour les claviers virtuels et onConfigurationChanged ne sera pas appelé pour les claviers virtuels.

57voto

amalBit Points 3406

C’est peut-être pas la solution la plus efficace. Mais cela a fonctionné pour moi à chaque fois... J’appelle cette fonction où que j’ai besoin d’écouter le softKeyboard.

Remarque : Si il y a une question que quelqu'un là-bas a été confrontée, laissez-moi savoir. Parce que j’utilise cela en production.

38voto

Nebojsa Tomcic Points 240

Si vous souhaitez gérer afficher/masquer de l'IMM (virtuel) du clavier de la fenêtre de votre Activité, vous aurez besoin d'une classe de votre mise en page et remplacer onMesure méthode(de sorte que vous pouvez déterminer la largeur et la hauteur mesurée de votre mise en page). Après cet ensemble de sous-classé disposition comme écran principal de votre Activité par setContentView(). Maintenant, vous serez capable de gérer IMM afficher/masquer la fenêtre événements. Si cela vous semble compliqué, il n'en est pas vraiment. Voici le code:

main.xml

   <?xml version="1.0" encoding="utf-8"?>
   <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:orientation="horizontal" >
        <EditText
             android:id="@+id/SearchText" 
             android:text="" 
             android:inputType="text"
             android:layout_width="fill_parent"
             android:layout_height="34dip"
             android:singleLine="True"
             />
        <Button
             android:id="@+id/Search" 
             android:layout_width="60dip"
             android:layout_height="34dip"
             android:gravity = "center"
             />
    </LinearLayout>

Maintenant à l'intérieur de votre Activité de déclarer la sous-classe pour votre mise en page (main.xml)

    public class MainSearchLayout extends LinearLayout {

    public MainSearchLayout(Context context, AttributeSet attributeSet) {
        super(context, attributeSet);
        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        inflater.inflate(R.layout.main, this);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        Log.d("Search Layout", "Handling Keyboard Window shown");

        final int proposedheight = MeasureSpec.getSize(heightMeasureSpec);
        final int actualHeight = getHeight();

        if (actualHeight > proposedheight){
            // Keyboard is shown

        } else {
            // Keyboard is hidden
        }
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    }
}

Vous pouvez le voir dans le code que nous gonfler mise en page pour notre Activité de constructeur de sous-classe

inflater.inflate(R.layout.main, this);

Et maintenant définir l'affichage du contenu de la sous-classé à la disposition de notre Activité.

public class MainActivity extends Activity {

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        MainSearchLayout searchLayout = new MainSearchLayout(this, null);

        setContentView(searchLayout);
    }

    // rest of the Activity code and subclassed layout...

}

22voto

Stefan Points 412

Basé sur le Code de Nebojsa Tomcic, j’ai développé la RelativeLayout-sous-classe suivante :

Cela fonctionne très bien... En affirmant que cette solution va travailler quand Soft Input de votre activité est réglée sur « WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE »

12voto

Gary Foster Points 101

Solution de Nebojsa presque a fonctionné pour moi. Quand j’ai cliqué à l’intérieur d’un EditText multiligne il savait le clavier a été affiché, mais quand j’ai commencé à taper à l’intérieur de l’EditText, l’actualHeight et proposedHeight étaient toujours le même, donc il ne savais pas qu’ils le clavier était toujours affiché. J’ai fait une légère modification pour stocker la hauteur maximum et il fonctionne très bien. Voici la sous-classe révisée :

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X