NEUE ANTWORT hinzugefügt am 25. Januar 2012
Seit ich die folgende Antwort geschrieben habe, hat mich jemand auf die Existenz von ViewTreeObserver und Freunde, APIs, die seit Version 1 im SDK schlummern.
Anstatt einen benutzerdefinierten Layout-Typ zu benötigen, besteht eine viel einfachere Lösung darin, der Root-Ansicht Ihrer Aktivität eine bekannte ID zu geben, etwa @+id/activityRoot
Hängen Sie einen GlobalLayoutListener in den ViewTreeObserver ein, und berechnen Sie von dort aus den Größenunterschied zwischen dem View Root Ihrer Aktivität und der Fenstergröße:
final View activityRootView = findViewById(R.id.activityRoot);
activityRootView.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
int heightDiff = activityRootView.getRootView().getHeight() - activityRootView.getHeight();
if (heightDiff > dpToPx(this, 200)) { // if more than 200 dp, it's probably a keyboard...
// ... do something here
}
}
});
Verwenden Sie ein Dienstprogramm wie:
public static float dpToPx(Context context, float valueInDp) {
DisplayMetrics metrics = context.getResources().getDisplayMetrics();
return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, valueInDp, metrics);
}
Vorsicht!
Nota: Ihre Anwendung muss dieses Flag im Android Manifest setzen android:windowSoftInputMode="adjustResize"
Andernfalls wird die obige Lösung nicht funktionieren.
ORIGINALANTWORT
Ja, es ist möglich, aber es ist viel schwieriger, als es sein sollte.
Wenn ich mich darum kümmern muss, wann die Tastatur erscheint und verschwindet (was ziemlich oft der Fall ist), dann passe ich meine Top-Level-Layout-Klasse in eine Klasse an, die Folgendes überschreibt onMeasure()
. Die grundlegende Logik ist, dass, wenn das Layout deutlich weniger als die Gesamtfläche des Fensters ausfüllt, wahrscheinlich eine weiche Tastatur angezeigt wird.
import android.app.Activity;
import android.content.Context;
import android.graphics.Rect;
import android.util.AttributeSet;
import android.widget.LinearLayout;
/*
* LinearLayoutThatDetectsSoftKeyboard - a variant of LinearLayout that can detect when
* the soft keyboard is shown and hidden (something Android can't tell you, weirdly).
*/
public class LinearLayoutThatDetectsSoftKeyboard extends LinearLayout {
public LinearLayoutThatDetectsSoftKeyboard(Context context, AttributeSet attrs) {
super(context, attrs);
}
public interface Listener {
public void onSoftKeyboardShown(boolean isShowing);
}
private Listener listener;
public void setListener(Listener listener) {
this.listener = listener;
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int height = MeasureSpec.getSize(heightMeasureSpec);
Activity activity = (Activity)getContext();
Rect rect = new Rect();
activity.getWindow().getDecorView().getWindowVisibleDisplayFrame(rect);
int statusBarHeight = rect.top;
int screenHeight = activity.getWindowManager().getDefaultDisplay().getHeight();
int diff = (screenHeight - statusBarHeight) - height;
if (listener != null) {
listener.onSoftKeyboardShown(diff>128); // assume all soft keyboards are at least 128 pixels high
}
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
}
Dann in Ihrer Activity-Klasse...
public class MyActivity extends Activity implements LinearLayoutThatDetectsSoftKeyboard.Listener {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
...
LinearLayoutThatDetectsSoftKeyboard mainLayout = (LinearLayoutThatDetectsSoftKeyboard)findViewById(R.id.main);
mainLayout.setListener(this);
...
}
@Override
public void onSoftKeyboardShown(boolean isShowing) {
// do whatever you need to do here
}
...
}
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/