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