559 votes

Comment vérifier la visibilité du clavier logiciel dans Android ?

J’ai besoin de faire une chose très simple - à savoir si le clavier logiciel s’affiche. Est-ce possible dans Android ?

698voto

Reuben Scratton Points 22314

NOUVELLE RÉPONSE ajouté 25 Jan 2012

Depuis la rédaction de la réponse ci-dessous, quelqu'un de doué-moi pour l'existence de ViewTreeObserver et les amis, les Api qui rôdent dans le SDK depuis la version 1.

Plutôt que d'exiger une Mise en page personnalisée de type, une solution beaucoup plus simple est de donner à votre activité, en vue de la racine connu ID, dire "@+id/activityRoot', crochet un GlobalLayoutListener dans le ViewTreeObserver, et à partir de là calculer la taille de diff entre votre activité, en vue de la racine et de la taille de la fenêtre:

final View activityRootView = findViewById(R.id.activityRoot);
activityRootView.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
    @Override
    public void onGlobalLayout() {
        int heightDiff = activityRootView.getRootView().getHeight() - activityRootView.getHeight();
        if (heightDiff > 100) { // if more than 100 pixels, its probably a keyboard...
            ... do something here
        }
     }
});

Facile!

RÉPONSE ORIGINALE À CETTE QUESTION

Oui c'est possible, mais il est beaucoup plus difficile qu'elle ne devrait l'être.

Si j'ai besoin de s'en soucier lorsque le clavier apparaît et disparaît (ce qui est assez souvent) alors ce que je fais est de personnaliser mon top-niveau classe de mise en page dans un qui remplace onMeasure(). La logique de base est que si la mise en page se trouve de remplissage de manière significative moins que la superficie totale de la fenêtre, puis un clavier souple est sans doute montrer.

import android.app.Activity;
import android.content.Context;
import android.graphics.Rect;
import android.util.AttributeSet;
import android.widget.LinearLayout;

/*
 * LinearLayoutThatDetectsSoftKeyboard - a variant of LinearLayout that can detect when 
 * the soft keyboard is shown and hidden (something Android can't tell you, weirdly). 
 */

public class LinearLayoutThatDetectsSoftKeyboard extends LinearLayout {

    public LinearLayoutThatDetectsSoftKeyboard(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public interface Listener {
        public void onSoftKeyboardShown(boolean isShowing);
    }
    private Listener listener;
    public void setListener(Listener listener) {
        this.listener = listener;
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        int height = MeasureSpec.getSize(heightMeasureSpec);
        Activity activity = (Activity)getContext();
        Rect rect = new Rect();
        activity.getWindow().getDecorView().getWindowVisibleDisplayFrame(rect);
        int statusBarHeight = rect.top;
        int screenHeight = activity.getWindowManager().getDefaultDisplay().getHeight();
        int diff = (screenHeight - statusBarHeight) - height;
        if (listener != null) {
            listener.onSoftKeyboardShown(diff>128); // assume all soft keyboards are at least 128 pixels high
        }
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);       
    }

    }

Ensuite, dans votre classe d'Activité...

public class MyActivity extends Activity implements LinearLayoutThatDetectsSoftKeyboard.Listener {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ...
        LinearLayoutThatDetectsSoftKeyboard mainLayout = (LinearLayoutThatDetectsSoftKeyboard)findViewById(R.id.main);
        mainLayout.setListener(this);
        ...
    }


    @Override
    public void onSoftKeyboardShown(boolean isShowing) {
        // do whatever you need to do here
    }

    ...
}

311voto

Kachi Points 1593

Alors j’espère que cela aide quelqu'un.

La réponse de nouveau que Reuben Scratton donnée est grande et vraiment efficace, mais il fonctionne vraiment uniquement si vous définissez votre windowSoftInputMode à adjustResize. Si vous le réglez à adjustPan, il ne parvient pas à détecter si le clavier est visible à l’aide de son extrait de code. Pour contourner ce problème, j’ai fait cette petite modification au code ci-dessus.

57voto

TacB0sS Points 2164

Il a été toujours en ce qui concerne l’ordinateur, mais cette question est toujours incroyablement pertinente !

Donc j’ai pris les réponses ci-dessus et ai combiné et affiné leur un peu...

Fonctionne pour moi  :)

51voto

Artem Zinnatullin Points 1396

Désolé pour la réponse tardive, mais j’ai avait créé une petite classe d’assistance pour gérer les événements d’ouverture/fermeture avec notification des auditeurs et autres choses utiles, peut-être quelqu'un pourrait s’avérer utile :

Exemple d’utilisation :

7voto

J'ai utilisé un peu de temps pour comprendre cela... j'ai couru quelques CastExceptions, mais pensé que vous pouvez remplacer vous LinearLayout dans le layout.xml avec le nom de la classe.

Comme ceci:

<?xml version="1.0" encoding="UTF-8"?>
<LinearLayout android:layout_width="fill_parent" android:layout_height="fill_parent"
    xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/llMaster">

<com.ourshoppingnote.RelativeLayoutThatDetectsSoftKeyboard android:background="@drawable/metal_background"
    android:layout_width="fill_parent" android:layout_height="fill_parent"
    android:id="@+id/rlMaster" >
    <LinearLayout android:layout_width="fill_parent"
        android:layout_height="1dip" android:background="@drawable/line"></LinearLayout>

          ....

</com.ourshoppingnote.RelativeLayoutThatDetectsSoftKeyboard>    


</LinearLayout>

De cette façon, vous n'avez pas de fonte des questions.

... et si vous ne voulez pas le faire sur chaque page, je vous recommande d'utiliser "MasterPage dans Android". Voir le lien ici: http://jnastase.alner.net/archive/2011/01/08/ldquomaster-pagesrdquo-in-android.aspx

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