it-swarm.com.de

Gibt es eine Möglichkeit in Android, die Höhe der virtuellen Tastatur des Geräts zu ermitteln

in Android gibt es eine Möglichkeit, die Höhe der virtuellen Tastatur eines Android-Geräts zur Laufzeit abzurufen. Eigentlich möchte ich ein Textfeld über der Tastatur anzeigen.

33
Zeeshan Mirza

Ja, Sie können mit Hilfe von Viewtree Observer und dem globalen Layout-Listener die unten beschriebenen Schritte ausführen

  1. Holen Sie sich die Grundansicht Ihres Layouts
  2. holen Sie sich den Viewtree-Beobachter für diesen Stamm und fügen Sie einen globalen Layout-Listener hinzu.

wenn nun eine Soft-Tastatur angezeigt wird, ändert Android die Größe des Bildschirms und Sie erhalten einen Anruf von Ihrem Hörer. Das einzige, was Sie jetzt tun müssen, ist die Differenz zwischen der Höhe, die Ihre Stammansicht nach der Größenänderung hat, und der ursprünglichen Größe zu berechnen. Wenn der Unterschied mehr als 150 beträgt, sollten Sie dies berücksichtigen, da eine Tastatur aufgeblasen wurde.

Unten ist ein Beispielcode

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.  
        }
  });

Grüße, Techfist

28
Techfist

Um das zu lösen, habe ich einen keyboardHeightProvider geschrieben, der die Höhe einer schwebenden Soft-Tastatur berechnen kann. Die Aktivität kann so eingestellt werden, dass None oder AdjustPan in der AndroidManifest.xml eingestellt wird.

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

Siebe

35
Siebe Brouwer

Ich habe viele vorgeschlagene Methoden ausprobiert, aber keine schien für Android SDL zu funktionieren. Ich denke, das liegt entweder daran, dass die SDL-Anzeige "Vollbild" ist oder dass sie sich in einem "AbsoluteLayout" befindet und daher die Höhe der "Ansicht" nie wirklich ändert. Diese Methode hat für mich funktioniert:

Ermitteln der Abmessungen der Softtastatur

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

setzen Sie das Textfeld als übergeordnetes Ende.

Android:layout_alignParentBottom="true"

und in der Manifestdatei die Soft-Eingabe adjustresize 

Android:windowSoftInputMode="adjustResize"

das Textfeld wird dann nach oben verschoben, wenn die Tastatur angezeigt wird.

6
null pointer

Du kannst es nicht sagen. Nein, wirklich: Man kann es einfach nicht sagen.

Die Tastatur muss keine bestimmte Form haben. Es muss nicht am unteren Rand des Bildschirms platziert werden ( viele der beliebtesten Optionen sind nicht ), es muss nicht seine aktuelle Größe beibehalten, wenn Sie Textfelder ändern (fast keine, abhängig von den Flaggen). Es muss nicht einmal rechteckig sein. Es kann auch nur der gesamte Bildschirm übernommen werden.

(Kopie meiner Antwort auf eine ähnliche Frage, Ermitteln der Abmessungen der Soft-Tastatur )

4
ctate

Ich habe ein Bibliotheksprojekt mit Android-Tastaturhöhe erstellt, auch wenn Aktivitäten nicht den adjustResize-Eingabemodus verwenden.

https://github.com/Crysis21/KeyboardHeightProvider

1

Meine Lösung ist die Kombination aller oben genannten Lösungen. Diese Lösung ist auch hackig, aber lösen Sie das Problem (zumindest für mich). 

  1. Ich habe Stellen auf temporärer Ansicht mit transparentem Hintergrund am unteren Rand des Bildschirms.
  2. Ich habe im Aktivitäts-Tag im Manifest Android:windowSoftInputMode="adjustResize"-Flag hinzugefügt, wie es @bill empfiehlt.
  3. Nun ist die Hauptgeschichte in onGlobalLayout(). Dort berechne ich die Differenz zwischen der y-Achse der temporären Ansicht und der Höhe der Wurzelansicht

    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
    
        }
    });
    

Aber um das Problem von @ zeeshan0026 zu lösen, reicht in Manifest Android:windowSoftInputMode="adjustResize" immer nur eine einzige Flagge aus. 

0
Gem

Ich habe dies verwendet, um die Tastaturhöhe programmgesteuert in Android zu erhalten und es zu testen. Bitte probieren Sie es einmal:

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;
                }
            });

Vielen Dank.

0
S G

Schau nicht mehr! Ich habe lange nach einer Lösung dafür gesucht. Nachdem ich tagelang alle Tricks ausprobiert hatte, fand ich die perfekte Lösung, die tatsächlich funktioniert.

Dieses GitHub-Projekt zeigt es auf die bestmögliche Weise: https://github.com/siebeprojects/samples-keyboardheight

Habe Spaß!

0
Barakuda