Ich muss etwas ganz Einfaches tun - herausfinden, ob die Software-Tastatur angezeigt wird. Ist dies in Android möglich?
Immer Configuration.KEYBOARDHIDDEN_NO.
Ich muss etwas ganz Einfaches tun - herausfinden, ob die Software-Tastatur angezeigt wird. Ist dies in Android möglich?
Versuchen Sie dies:
final View activityRootView = getWindow().getDecorView().getRootView();
activityRootView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
Rect r = new Rect();
//r will be populated with the coordinates of your view that area still visible.
activityRootView.getWindowVisibleDisplayFrame(r);
int heightDiff = activityRootView.getRootView().getHeight() - (r.bottom - r.top);
if (heightDiff < activityRootView.getRootView().getHeight() / 4 ) { // if more than 100 pixels, its probably a keyboard...
// ... do something here ... \\
}
}
});
Es ist zwar schon ewig her, was den Computer betrifft, aber diese Frage ist immer noch unglaublich aktuell! Also habe ich die obigen Antworten genommen und sie ein wenig kombiniert und verfeinert...
public interface OnKeyboardVisibilityListener {
void onVisibilityChanged(boolean visible);
}
public final void setKeyboardListener(final OnKeyboardVisibilityListener listener) {
final View activityRootView = ((ViewGroup) getActivity().findViewById(android.R.id.content)).getChildAt(0);
activityRootView.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
private boolean wasOpened;
private final Rect r = new Rect();
@Override
public void onGlobalLayout() {
activityRootView.getWindowVisibleDisplayFrame(r);
int heightDiff = activityRootView.getRootView().getHeight() - (r.bottom - r.top);
boolean isOpen = heightDiff > 100;
if (isOpen == wasOpened) {
logDebug("Ignoring global layout change...");
return;
}
wasOpened = isOpen;
listener.onVisibilityChanged(isOpen);
}
});
}
Das funktioniert bei mir.
Ich habe festgestellt, dass eine Kombination aus der Methode von @Reuben_Scratton und der von @Yogesh am besten funktioniert. Die Kombination ihrer Methoden würde etwa so aussehen:
final View activityRootView = findViewById(R.id.activityRoot);
activityRootView.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
if (getResources().getConfiguration().keyboardHidden == Configuration.KEYBOARDHIDDEN_NO) { // Check if keyboard is not hidden
// ... do something here
}
}
});
Keine dieser Lösungen wird für Lollipop in der jetzigen Form funktionieren. In Lollipop activityRootView.getRootView().getHeight()
schließt die Höhe der Schaltflächenleiste ein, während die Messung der Ansicht nicht berücksichtigt wird. Ich habe die beste/einfachste Lösung oben angepasst, um mit Lollipop zu arbeiten.
final View activityRootView = findViewById(R.id.activityRoot);
activityRootView.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
Rect r = new Rect();
//r will be populated with the coordinates of your view that area still visible.
activityRootView.getWindowVisibleDisplayFrame(r);
int heightDiff = activityRootView.getRootView().getHeight() - (r.bottom - r.top);
Resources res = getResources();
// The status bar is 25dp, use 50dp for assurance
float maxDiff =
TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 50, res.getDisplayMetrics());
//Lollipop includes button bar in the root. Add height of button bar (48dp) to maxDiff
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
float buttonBarHeight =
TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 48, res.getDisplayMetrics());
maxDiff += buttonBarHeight;
}
if (heightDiff > maxDiff) { // if more than 100 pixels, its probably a keyboard...
...do something here
}
}
});
Warum wurde eine ähnliche Lösung nicht von stackoverflow.com/a/18992807/2914140 funktionieren und wie unterscheidet sich Ihre Lösung davon?
Ich habe eine leichte Variante der Antwort von Reuban verwendet, die sich unter bestimmten Umständen als hilfreicher erwiesen hat, insbesondere bei Geräten mit hoher Auflösung.
final View activityRootView = findViewById(android.R.id.content);
activityRootView.getViewTreeObserver().addOnGlobalLayoutListener(
new OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
int heightView = activityRootView.getHeight();
int widthView = activityRootView.getWidth();
if (1.0 * widthView / heightView > 3) {
//Make changes for Keyboard not visible
} else {
//Make changes for keyboard visible
}
}
});
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.
9 Stimmen
Obwohl die Antwort von Reuben Scratton gut ist, scheint sie auf einem Tablet nicht zu funktionieren. Ich habe die Prüfung diff>128 durch diff>screenHeight/3 ersetzt.
2 Stimmen
Die Antwort von Reuben Scratton war gut, aber ich brauchte die Anpassung von KaChi, um sie wirklich nutzen zu können.
0 Stimmen
Anstatt nur den Höhenunterschied zu prüfen, können wir Folgendes tun
View v = this.getCurrentFocus();if (diff>100 && v != null){ // Its keyboard } else { //Keyboard hidden }
0 Stimmen
Sie können diese Methode ausprobieren, sie hat bei mir gut funktioniert. stackoverflow.com/questions/4745988/
0 Stimmen
@ChristopherHackl danke, das funktioniert bei mir
0 Stimmen
2018 immer noch darüber wüten
0 Stimmen
Ich habe einen Weg gefunden, dies zu tun: stackoverflow.com/questions/4745988/ (cc @FloWe)
2 Stimmen
Warum macht Google nicht eine Standardmethode, die für alle Tastatur-Apps funktioniert?
0 Stimmen
Für diejenigen, die nach einer Antwort suchen, gibt es eine saubere Lösung: stackoverflow.com/a/54761109/5730321
5 Stimmen
Es bricht mir immer noch das Herz, dass dies kein System ist, das funktioniert...
1 Stimmen
Es ist völlig verrückt, dass diese API immer noch nicht vorhanden ist. 10 Jahre später . Ich bin sehr froh, dass ich von Android weggegangen bin.
0 Stimmen
Dort finden Sie die Antwort stackoverflow.com/questions/25216749/