web-dev-qa-db-de.com

Ermitteln der Abmessungen der Softtastatur

Gibt es eine Möglichkeit, die Größe der auf dem Bildschirm angezeigten Tastatur zu ermitteln?

Ich verwende Cocos2dx zum Programmieren, aber ich möchte die Höhe der Tastatur wissen, die auf dem Bildschirm von Android oder von Cocos angezeigt wird. Es spielt keine Rolle.

Ich weiß, dass Keyboard eine getHeight () -Methode hat, aber ich möchte keine neuen Tastaturen erstellen, ich möchte die Standardeinstellung verwenden.

25
Rudy_TM

Wir haben es damit gemacht

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

                @Override
                public void onGlobalLayout() {

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

                }
            });

Die Größe der Ansichten ändern wir nur mit der Tastatur, sodass wir diese verwenden können. 

33
Rudy_TM
Rect r = new Rect();
View rootview = this.getWindow().getDecorView(); // this = activity
rootview.getWindowVisibleDisplayFrame(r);

Das Ergebnis ist die Menge an Speicherplatz, die Ihre Anwendung auf dem Bildschirm belegt (funktioniert auch, wenn die Aktivität nicht geändert wurde). Offensichtlich wird der verbleibende Bildschirmplatz von der Tastatur verwendet (sofern sichtbar).

Hier oben gefundene ID: https://github.com/freshplanet/ANE-KeyboardSize/blob/master/Android/src/com/freshplanet/ane/KeyboardSize/getKeyboardY.Java

20
FDIM

wenn Ihre Aktivität nicht im Vollbildmodus ist, verwenden Sie den folgenden Code:

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

                @Override
                public void onGlobalLayout() {
                    // TODO Auto-generated method stub
                    if (keyBoardHeight <= 100) {
                        Rect r = new Rect();
                        content.getWindowVisibleDisplayFrame(r);

                        int screenHeight = content.getRootView()
                                .getHeight();
                        int heightDifference = screenHeight
                                - (r.bottom - r.top);
                        int resourceId = getResources()
                                .getIdentifier("status_bar_height",
                                        "dimen", "Android");
                        if (resourceId > 0) {
                            heightDifference -= getResources()
                                    .getDimensionPixelSize(resourceId);
                        }
                        if (heightDifference > 100) {
                            keyBoardHeight = heightDifference;
                        }

                        Log.d("Keyboard Size", "Size: " + heightDifference);
                    }
                    // boolean visible = heightDiff > screenHeight / 3;
                }
            });
9
Habbot Phan

Wenn Sie die Höhe der virtuellen Tastatur berechnen möchten, während sich Ihre Aktivität nicht in der Größe ändert (adjustPan), können Sie dieses Beispiel verwenden:

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

Es verwendet ein verborgenes Fenster, um den Höhenunterschied zwischen dem Fenster und der Stammansicht der Aktivität zu berechnen. 

5
Siebe Brouwer

Ich weiß, dass dies ein alter Beitrag ist, aber ich habe festgestellt, dass die für mich gewählte Lösung nicht auf allen Geräten funktioniert. Es schien eine Diskrepanz zu geben und so habe ich das umgesetzt und es scheint ein Haken zu sein:

        final int[] discrepancy = new int[1];
        discrepancy[0] = 0;

        // this gets the height of the keyboard
        content.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {

            @Override
            public void onGlobalLayout() {
                Rect r = new Rect();
                View rootview = activity.getWindow().getDecorView(); // this = activity
                rootview.getWindowVisibleDisplayFrame(r);

                int screen_height = rootview.getRootView().getHeight();
                int keyboard_height = screen_height - (r.bottom + r.top) - discrepancy[0];

                if (discrepancy[0] == 0) {
                    discrepancy[0] = keyboard_height;
                    if (keyboard_height == 0) discrepancy[0] = 1;
                }

                int margin_bottom = keyboard_height + Helper.getDp(10, activity);

                RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) carousel_container.getLayoutParams();
                params.setMargins(0, 0, 0, margin_bottom);

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

Wenn der Listener zum ersten Mal aufgerufen wird, misst er den Bildschirm ohne Tastatur, und wenn es eine Diskrepanz gibt, wird dies beim nächsten Mal berücksichtigt. Wenn keine Diskrepanz besteht, setze ich die Diskrepanz auf 1, damit sie nicht mehr 0 ist.

3
noshaf

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 options 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 übernehmen.

3
ctate

in cocos2d-x haben wir CCEditBox.

In Extensions-> GUI-> CCEditBox finden Sie die Klasse CCEditBox.

Das Schöne ist, dass es die Tastatur verbirgt, woanders auf der Szene zu klopfen. und bewegt die Tastatur automatisch nach oben, wenn das Bearbeitungsfeld zu niedrig in der Szene platziert wurde.

Wenn Sie cocos2d-x v2.1.3 verwenden, können Sie zum Beispielprojekt navigieren, indem Sie zu gehen

beispiel-> cpp-> TestCpp-> Klassen-> ExtensionTest-> EditBoxTest.

Ich werde es von jetzt an nur noch anstelle von CCTextField verwenden. Gestern bin ich darauf gestoßen :)

2
Azhar Yousuf

Nach stundenlangem Suchen habe ich eine Lösung gefunden , wenn Sie windowSoftInput="adjustPan" einstellen wollen

Hier ist das Code-Snippet:

    final View root  = findViewById(Android.R.id.content);
    root.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
    Rect r = new Rect();
    {
        root.getWindowVisibleDisplayFrame(r);
    }
    @Override
    public void onGlobalLayout() {
        Rect r2 = new Rect();
        root.getWindowVisibleDisplayFrame(r2);
        int keyboardHeight = r.height() - r2.height();
        if (keyboardHeight > 100) {
            root.scrollTo(0, keyboardHeight);
        }
        else {
            root.scrollTo(0, 0);
        }
    }
});

Nachdem ich die Tastaturhöhe gefunden habe, scrolle ich in diesem Code die Ansicht nach oben, sodass sie nicht von der Tastatur abgedeckt wird. Dies ist der Hauptgrund für das Ermitteln der Tastaturhöhe.

Nach den docs

void getWindowVisibleDisplayFrame(Rect outRect): Ermitteln Sie die Gesamtgröße der sichtbaren Anzeige, in der das Fenster, in dem diese Ansicht angezeigt wird, positioniert wurde. 

1
Ali Zeynali

Vollständige Antwort und funktionierte perfekt für mich: 

  Rect r = new Rect();
  View rootview = this.getWindow().getDecorView(); // this = activity
  rootview.getWindowVisibleDisplayFrame(r);
  int keyboardHeight = rootview.getHeight() - r.bottom;
0
Amit

Der ROOT_VIEW eines Android-Bildschirms kann als ein einzelner Bildschirm mit VISIBLE DISPLAY FRAME dargestellt werden, der die Ansicht Ihrer Aktivität anzeigt.

Dieser SICHTBARE ANZEIGE-RAHMEN wird eingestellt, wenn SOFT KEYBOARD auf dem Bildschirm angezeigt oder ausgeblendet wird.

HINWEIS: Bitte schauen Sie sich die beiden Bilder an, indem Sie auf die unten angegebenen Links klicken, um das Verständnis zu verbessern 

So kann die ROOT VIEW eines Bildschirms wie folgt dargestellt werden: RootView des Bildschirms

Die Einstellung von VISIBLE DISPLAY FRAME beim Öffnen und Schließen von SOFT KEYBOARD kann wie folgt dargestellt werden: VISIBLE_DISPLAY_SCREEN-Einstellung

Diese Einstellung des VISUAL DISPLAY FRAME kann sehr gut verwendet werden, um die Höhe der Tastatur zu ermitteln:

(wenn die Softtastatur geöffnet ist)

SOFT_KEYBOARD_HEIGHT = ROOT_VIEW_HEIGHT - (VISUAL_DISPLAY_FRAME_HEIGHT + EXTRA_SCREEN_HEIGHT)

Der Code, um das oben zu erreichen, lautet: 

int mExtraScreenHeight=-1, mKeyboardHeight=-1;
boolean mKeyboardOpen;



    rootView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {

            int rootViewHeight, visibleDisplayFrameHeight, fakeHeight;

            /* (rootViewHeight - visibleDisplayFrameHeight) is not the real height of the keyboard
                it is the fake height as it also consist of extra screen height
                so FAKE_HEIGHT = KEYBOARD_HEIGHT + EXTRA_SCREEN_HEIGHT

                To get keyboard height extra screen height must be removed from fake height
             */

            Rect rect = new Rect();
            rootView.getWindowVisibleDisplayFrame(rect);

            rootViewHeight = rootView.getRootView().getHeight();
            visibleDisplayFrameHeight = rect.height();

            fakeHeight = rootViewHeight-visibleDisplayFrameHeight;

            if (mExtraScreenHeight == -1){
                mExtraScreenHeight=fakeHeight;
            }
            /* Suppose the soft keyboard is open then the VISIBLE_DISPLAY_FRAME is in reduced size
                due to the space taken up by extra screen and the keyboard but when the soft keyboard closes
                then KEYBOARD_HEIGHT=0 and thus FAKE_HEIGHT = EXTRA_SCREEN_HEIGHT
             */
            else if (fakeHeight <= mExtraScreenHeight){
                mExtraScreenHeight=fakeHeight;
                mKeypadOpen=false;
            }
            else if (fakeHeight > mExtraScreenHeight){
                mKeypadHeight=fakeHeight-mExtraScreenHeight;
                mKeypadOpen=true;
            }
        }
    });

NOTE: Die onGlobalLayout () - Funktion wird nur aufgerufen, wenn sich das globale Layout ändert, z. B. wenn sich die Soft-Tastatur öffnet. Die Soft-Tastatur muss also mindestens einmal geöffnet sein, um die Höhe der Soft-Tastatur zu erhalten.

Es hat für mich funktioniert;)

0
Pratik Gawali

Es tut uns leid, dass ich nicht kommentieren konnte. Zwei oder drei der Antworten halfen mir, mein Problem zu lösen. Sie standen im Zusammenhang mit der Verwendung des AddOnGlobalLayoutListener und der Ermittlung der verbleibenden Höhe, bevor und nachdem eine Tastatur aufgetaucht war.

Die von mir verwendete Lösung basierte auf der Antwort von Rudy_TM.

Eine Sache, die ich jedoch finden musste, war, dass die folgende Zeile irgendwo vorhanden sein muss, damit diese Methode funktioniert

Window.SetSoftInputMode(SoftInput.AdjustResize);

Vorher hatte ich SoftInput.AdjustNothing (oder so ähnlich) und es würde nicht funktionieren. Jetzt funktioniert es perfekt. Danke für die Antworten!

0
Kalikovision