web-dev-qa-db-fra.com

Android EditText, événement d'affichage/masquage du clavier logiciel?

Est-il possible d'attraper l'événement que Soft Keyboard a été affiché ou masqué pour EditText?

44
shkim

Salut j'avais utilisé la solution suivante:

Dans la mesure où ma vue de contenu est une sous-classe de LinearLayout (il peut s'agir d'une autre vue ou d'un groupe de vues), j'ai remplacé la méthode onMeasure par lilke comme suit:

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    final int proposedheight = MeasureSpec.getSize(heightMeasureSpec);
    final int actualHeight = getHeight();

    if (actualHeight > proposedheight){
        // Keyboard is shown
    } else {
        // Keyboard is hidden
    }

    super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}

Cette solution de contournement m'a aidé à masquer certaines commandes lorsque le clavier est affiché et à les rétablir autrement.

J'espère que cela serait utile.

29
woodshy

Il n'y a pas réellement un tel événement à attraper. L'IME montre et cache simplement sa fenêtre; Le retour que vous obtenez est le gestionnaire de fenêtres qui redimensionne le contenu de votre propre fenêtre si vous l'avez mis en mode redimensionnement.

18
hackbod

J'ai résolu ce problème en utilisant onGlobalLayoutListener: 

 final View activityRootView = findViewById(R.id.top_root);
        activityRootView.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
            public void onGlobalLayout() {
                int heightDiff = activityRootView.getRootView().getHeight() - activityRootView.getHeight();

                if (heightDiff > 100) {
                    // keyboard is up
                } else {
                    // keyboard is down
                }
            }
        });

Ici activityRootView est la vue racine de votre activité.

4
Varun Verma

Dans mon cas, je voulais cacher une barre inférieure lorsque le clavier virtuel était affiché. J'ai jugé préférable de simplement masquer la barre lorsque la mise en page avait une taille inférieure à un pourcentage de la taille d'une mise en page normale. J'ai donc utilisé cette solution qui fonctionne bien compte tenu du fait qu'un clavier logiciel prend généralement 20% ou plus de la hauteur de l'écran. Modifiez simplement la constante de pourcentage en fonction de la valeur que vous jugez acceptable. Il a besoin de l'attribut Android: windowSoftInputMode = "adjustResize" dans le manifeste et la présentation doit être la racine pour fonctionner.

Étendez à partir de n'importe quelle mise en page que vous souhaitez au lieu de RelativeLayout.

public class SoftKeyboardLsnedRelativeLayout extends RelativeLayout {
    private boolean isKeyboardShown = false;
    private List<SoftKeyboardLsner> lsners=new ArrayList<SoftKeyboardLsner>();
    private float layoutMaxH = 0f; // max measured height is considered layout normal size
    private static final float DETECT_ON_SIZE_PERCENT = 0.8f;

    public SoftKeyboardLsnedRelativeLayout(Context context) {
        super(context);
    }

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

    @SuppressLint("NewApi")
    public SoftKeyboardLsnedRelativeLayout(Context context, AttributeSet attrs,
            int defStyle) {
        super(context, attrs, defStyle);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        final int newH = MeasureSpec.getSize(heightMeasureSpec);
        if (newH > layoutMaxH) {
            layoutMaxH = newH;
        }
        if (layoutMaxH != 0f) {
            final float sizePercent = newH / layoutMaxH;
            if (!isKeyboardShown && sizePercent <= DETECT_ON_SIZE_PERCENT) {
                isKeyboardShown = true;
                for (final SoftKeyboardLsner lsner : lsners) {
                    lsner.onSoftKeyboardShow();
                }
            } else if (isKeyboardShown && sizePercent > DETECT_ON_SIZE_PERCENT) {
                isKeyboardShown = false;
                for (final SoftKeyboardLsner lsner : lsners) {
                    lsner.onSoftKeyboardHide();
                }
            }
        }
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    }

    public void addSoftKeyboardLsner(SoftKeyboardLsner lsner) {
        lsners.add(lsner);
    }

    public void removeSoftKeyboardLsner(SoftKeyboardLsner lsner) {
        lsners.remove(lsner);
    }

    // Callback
    public interface SoftKeyboardLsner {
        public void onSoftKeyboardShow();
        public void onSoftKeyboardHide();
    }
}

Exemple:

layout/my_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<yourclasspackage.SoftKeyboardLsnedRelativeLayout 
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:id="@+id/myLayout"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent">
    ...
</yourclasspackage.SoftKeyboardLsnedRelativeLayout>

MyActivity.Java

public class MyActivity extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.my_layout);
        SoftKeyboardLsnedRelativeLayout layout = (SoftKeyboardLsnedRelativeLayout) findViewById(R.id.myLayout);
        layout.addSoftKeyboardLsner(new SoftKeyboardLsner() {
            @Override
            public void onSoftKeyboardShow() {
                Log.d("SoftKeyboard", "Soft keyboard shown");
            }

            @Override
            public void onSoftKeyboardHide() {
                Log.d("SoftKeyboard", "Soft keyboard hidden");
            }
        });
    }
}
2
Lolme

essayez ces méthodes: showSoftInput(View, int, ResultReceiver) et hideSoftInputFromWindow(IBinder, int, ResultReceiver). Vous pouvez remplacer la méthode onReceiveResult(int resultCode, Bundle resultData) de la classe ResultReceiver pour gérer les événements d'affichage/masquage. 

1
single-minded

De nombreux développeurs Android aiment modifier la mise en page en fonction de l'affichage ou non du clavier virtuel.Afin de résoudre ce problème, vous pouvez voir Android: Détecter le clavier logiciel ouvert . Et cela fonctionne pour moi et je pense que c'est tellement utile bien.

0
John smith