web-dev-qa-db-fra.com

Y at-il un moyen dans Android d’avoir la hauteur du clavier virtuel de

y a-t-il un moyen dans Android d'obtenir la hauteur du clavier virtuel d'un appareil Android en temps d'exécution? En fait, je veux afficher la zone de texte au-dessus du clavier.

33
Zeeshan Mirza

Oui, vous pouvez, avec l'aide de Viewtree Observer et de Listener Global Layener, essayez les étapes ci-dessous.

  1. Obtenir la vue racine de votre mise en page
  2. obtenir l'observateur Viewtree pour cette racine et ajouter un écouteur de disposition global en plus de cela.

maintenant, chaque fois que le clavier virtuel est affiché, Android redimensionnera votre écran et vous recevrez un appel sur votre auditeur. La seule chose que vous ayez maintenant à faire est de calculer la différence de hauteur entre votre vue racine après redimensionnement et la taille originale. Si la différence est supérieure à 150, considérez cela comme un clavier gonflé.

Ci-dessous un exemple de code

root.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener(){
     public void onGlobalLayout(){
           int heightDiff = root.getRootView().getHeight()- root.getHeight();
           // IF height diff is more then 150, consider keyboard as visible.  
        }
  });

Cordialement, Techfist

28
Techfist

Pour résoudre ce problème, j'ai écrit un keyboardHeightProvider qui permet de calculer la hauteur d'un clavier logiciel flottant. L'activité peut être définie sur adjustNone ou adjustPan dans le fichier AndroidManifest.xml.

https://github.com/siebeprojects/samples-keyboardheight

Siebe

35
Siebe Brouwer

J'ai essayé de nombreuses méthodes suggérées pour cela, mais aucune ne semblait fonctionner pour Android SDL. Je pense que c'est soit parce que l'affichage SDL est "plein écran", soit parce qu'il se trouve dans un "AbsoluteLayout" et que, par conséquent, la hauteur de la "Vue" ne change jamais réellement. Cette méthode a fonctionné pour moi:

Obtenir les dimensions du clavier virtuel

mRootWindow = getWindow();
mRootView = mRootWindow.getDecorView().findViewById(Android.R.id.content);
mRootView.getViewTreeObserver().addOnGlobalLayoutListener(
    new ViewTreeObserver.OnGlobalLayoutListener() {
    public void onGlobalLayout(){
        Rect r = new Rect();
        View view = mRootWindow.getDecorView();
        view.getWindowVisibleDisplayFrame(r);
        // r.left, r.top, r.right, r.bottom
    }
    });
33
Dave Lawrence

mettre la zone de texte comme parent en bas.

Android:layout_alignParentBottom="true"

et dans le fichier manifeste, effectuez la saisie logicielle adjustresize 

Android:windowSoftInputMode="adjustResize"

alors la zone de texte se déplacera vers le haut lorsque le clavier apparaîtra.

6
null pointer

Vous ne pouvez pas dire. Non, vraiment: vous ne pouvez tout simplement pas dire.

Le clavier n'a pas besoin d'être de forme particulière. Il ne doit pas nécessairement être placé au bas de l'écran ( plusieurs du le plus populaire options ne sont pas ), il n'est pas obligé de conserver sa valeur actuelle. taille lorsque vous modifiez les champs de texte (presque aucun ne dépend des drapeaux). Il n'est même pas nécessaire que ce soit rectangulaire . Il est également possible que vous preniez simplement le écran complet .

(copie de ma réponse à une question similaire, indiquant les dimensions du clavier virtuel } _)

4
ctate

J'ai créé un projet de bibliothèque pour obtenir la hauteur de clavier Android, même lorsque les activités n'utilisent pas le mode de saisie adjustResize.

https://github.com/Crysis21/KeyboardHeightProvider

1
Cristian Holdunu

Ma solution est la combinaison de toutes les solutions ci-dessus. Cette solution est également hacky mais résolvez le problème (du moins pour moi). 

  1. J'ai des endroits sur la vue temporaire avec un arrière-plan transparent au bas de l'écran.
  2. J'ai ajouté le drapeau Android:windowSoftInputMode="adjustResize" dans la balise activity dans le manifeste, comme le suggère @bill.
  3. Maintenant, l'histoire principale est en onGlobalLayout(). Là, je calcule la différence entre l’axe y de la vue temporaire et la hauteur de la vue racine

    final View view = findViewById(R.id.base);
    
    view.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
    
        @Override
        public void onGlobalLayout() {
    
            int rootViewHeight = view.getRootView().getHeight();
            View tv = findViewById(R.id.temp_view);
            int location[] = new int[2];
            tv.getLocationOnScreen(location);
            int height = (int) (location[1] + tv.getMeasuredHeight());
            deff = rootViewHeight - height;
            // deff is the height of soft keyboard
    
        }
    });
    

Quoi qu'il en soit, pour résoudre le problème de @ zeeshan0026, un seul indicateur dans le manifeste Android:windowSoftInputMode="adjustResize" suffit. 

0
Gem

Je l'ai utilisé pour obtenir la hauteur du clavier par programme dans Android et l'ai testé, veuillez essayer cette fois

myLayout.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {

                @Override
                public void onGlobalLayout() {
                    // TODO Auto-generated method stub
                    Rect r = new Rect();
                    parent.getWindowVisibleDisplayFrame(r);

                    int screenHeight = parent.getRootView().getHeight();
                    int heightDifference = screenHeight - (r.bottom - r.top);
                    Log.d("Keyboard Size", "Size: " + heightDifference);

                    //boolean visible = heightDiff > screenHeight / 3;
                }
            });

Je vous remercie.

0
S G

Ne regarde plus! Je cherchais une solution à ce problème depuis longtemps. Après des jours d’essais sur tous les trucs suggérés sur SOF, j’ai trouvé la solution parfaite qui fonctionne réellement.

Ce projet GitHub le démontre de la meilleure façon possible: https://github.com/siebeprojects/samples-keyboardheight

S'amuser!

0
Barakuda