Ich muss etwas ganz Einfaches tun - herausfinden, ob die Software-Tastatur angezeigt wird. Ist dies in Android möglich?
Antwortet immer, was sichtbar ist
Ich muss etwas ganz Einfaches tun - herausfinden, ob die Software-Tastatur angezeigt wird. Ist dies in Android möglich?
Ich denke, diese Methode wird Ihnen helfen, herauszufinden, ob die Tastatur sichtbar ist oder nicht.
public Boolean isSoftKeyBoardVisible(){
InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
if (imm.isAcceptingText()) {
Log.d(TAG,"Software Keyboard was shown");
return true;
} else {
Log.d(TAG,"Software Keyboard was not shown");
return false;
}
}
Machen Sie keinen harten Code. Der beste Weg ist, müssen Sie Ihre Ansichten, während auf Get Focus on EditText mit KeyBord Show Größe ändern. Sie können dies tun, indem Sie die Eigenschaft resize für die Aktivität in der Manifestdatei mit dem unten stehenden Code hinzufügen.
android:windowSoftInputMode="adjustResize"
Meine Antwort ist im Grunde die gleiche wie die von Kachi, aber ich habe sie in eine nette Helper-Klasse verpackt, um die Art und Weise, wie sie in meiner App verwendet wird, zu bereinigen.
import android.app.Activity;
import android.app.Fragment;
import android.graphics.Rect;
import android.view.View;
import android.view.ViewTreeObserver.OnGlobalLayoutListener;
/**
* Detects Keyboard Status changes and fires events only once for each change
*/
public class KeyboardStatusDetector {
KeyboardVisibilityListener visibilityListener;
boolean keyboardVisible = false;
public void registerFragment(Fragment f) {
registerView(f.getView());
}
public void registerActivity(Activity a) {
registerView(a.getWindow().getDecorView().findViewById(android.R.id.content));
}
public KeyboardStatusDetector registerView(final View v) {
v.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
Rect r = new Rect();
v.getWindowVisibleDisplayFrame(r);
int heightDiff = v.getRootView().getHeight() - (r.bottom - r.top);
if (heightDiff > 100) { // if more than 100 pixels, its probably a keyboard...
/** Check this variable to debounce layout events */
if(!keyboardVisible) {
keyboardVisible = true;
if(visibilityListener != null) visibilityListener.onVisibilityChanged(true);
}
} else {
if(keyboardVisible) {
keyboardVisible = false;
if(visibilityListener != null) visibilityListener.onVisibilityChanged(false);
}
}
}
});
return this;
}
public KeyboardStatusDetector setVisibilityListener(KeyboardVisibilityListener listener) {
visibilityListener = listener;
return this;
}
public static interface KeyboardVisibilityListener {
public void onVisibilityChanged(boolean keyboardVisible);
}
}
Auf diese Weise können Sie überall in der App Tastaturänderungen erkennen:
new KeyboardStatusDetector()
.registerFragment(fragment) //register to a fragment
.registerActivity(activity) //or register to an activity
.registerView(view) //or register to a view
.setVisibilityListener(new KeyboardVisibilityListener() {
@Override
public void onVisibilityChanged(boolean keyboardVisible) {
if(keyboardVisible) {
//Do stuff for keyboard visible
}else {
//Do stuff for keyboard hidden
}
}
});
Hinweis: Verwenden Sie nur einen der "Register"-Aufrufe. Sie funktionieren alle gleich und sind nur der Einfachheit halber vorhanden
Ich hatte Schwierigkeiten, den Tastaturstatus beizubehalten, wenn ich die Ausrichtung von Fragmenten innerhalb eines Viewpagers änderte. Ich bin nicht sicher, warum, aber es scheint nur zu sein, wonky und verhält sich anders als eine Standard-Aktivität.
Um den Tastaturstatus in diesem Fall zu erhalten, sollten Sie zunächst android:windowSoftInputMode = "stateUnchanged"
zu Ihrem AndroidManifest.xml
. Sie werden jedoch feststellen, dass dies nicht das gesamte Problem löst - die Tastatur öffnete sich für mich nicht, wenn sie bereits vor der Ausrichtungsänderung geöffnet war. In allen anderen Fällen schien das Verhalten korrekt zu sein.
Dann müssen wir eine der hier genannten Lösungen umsetzen. Die sauberste, die ich gefunden habe, war die von George Maisuradze - verwenden Sie den booleschen Callback von hideSoftInputFromWindow:
InputMethodManager imm = (InputMethodManager) getSystemService(Activity.INPUT_METHOD_SERVICE);
return imm.hideSoftInputFromWindow(mViewPager.getWindowToken(), 0);
Ich habe diesen Wert in meinem Fragment in der onSaveInstanceState
Methode und rief sie ab onCreate
. Dann zeigte ich gewaltsam die Tastatur in onCreateView
wenn es einen Wert von true
(es wird true zurückgegeben, wenn die Tastatur sichtbar ist, bevor sie vor der Zerstörung des Fragments tatsächlich versteckt wird).
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/