Leerer Raum, wenn ich zur Aktivität zurückkehre (Soft-Tastatur erzwungen)
ich habe einActionView
mit Menüpunkt einActionBar
(mitActionBarSherlock) Kann ich eineEditText
als Suchfeld drin. Es ist eine Eingabe, um eine andere zu startenActivity
mit einerCustomView
in der ActionBar, die das gleiche Layout anzeigt (ich verwende nichts, um das zu erzwingen)SoftKeyboard
Um in dieser zweiten Aktivität zu erscheinen, gibt es hier kein Problem. Wenn ich möchte, dass die Bildschirmtastatur automatisch angezeigt bzw. ausgeblendet wird, wenn die Ansicht in der ersten Aktivität ausgeblendet wird, verwende ich Folgendes:
openKeyboard-Methode
mImm.toggleSoftInput(InputMethodManager.SHOW_FORCED, InputMethodManager.HIDE_IMPLICIT_ONLY);
closeKeyboard-Methode
mImm.hideSoftInputFromWindow(edittext.getWindowToken(), 0);
Ich verwende dasActionExpandListener
, damit das SoftKeyboard angezeigt oder ausgeblendet wird, wenn dieView
expandiert oder kollabiert. Mit diesen beiden oben genannten Methoden habe ich das erwartete Ergebnis. Ich fand dies bei mehreren Fragen zu SO (insbesondere zuSchließe / verstecke die Android-Tastatur undAnzeigen der Softtastatur für SearchView in ActionBar oderÖffnen der Soft-Tastatur erzwingen).
Nur um zu verstehen, wann ich benutzt habeSHOW_IMPLICIT
oderSHOW_FORCED
Alleine auf niedrigere Versionen (als 2. +) hatte dies keine Auswirkung. Der EditText war fokussiert, aber die Tastatur wurde nicht angezeigt (Sie vermuten also, es war eine schlechte Sache). In neueren Versionen (wie zum Beispiel 4. +) war es ein schöner Effekt und kein Problem. Dann habe ich die Tastatur gezwungen, sich mit der zu zeigenopenKeyboard-Methode über.
Jetzt habe ich ein paar Probleme damit ...
In niedrigeren Versionen habe ich vor und nach dem Erstellen / Zerstören der Tastatur "leeren" Speicherplatz, damit kann ich leben.ABER in neueren versionen habe ich "leeren" platz bekommen den es anzeigt wenn ichkehren Sie zur ersten Aktivität zurück. Und es ist in weniger als einer Sekunde hier, aber ausreichend, um das zu sehen!
Um besser zu verstehen, was passiert, sehen Sie sich das folgende Bild an:
1. Zweite Aktivität: Ich drücke die Up Home-Taste - die Tastatur verschwindet ordnungsgemäß.
2. (zurück zu) Erste Aktivität: Meine ListView wird von einem "leeren" Bereich abgedeckt (Hintergrundfarbe in meiner Anwendung). Und es verschwindet(Dies ist zweifellos die gleiche Höhe des SoftKeyboards!)
Ich denke, es liegt daranIch habe die Tastatur gezwungen zu erscheinen in meiner ersten Tätigkeitobwohl ich auch die tastatur zum verstecken gezwungen habe wenn ich zum zweiten gehe, aber wie kann ich den "leeren" Raum auflösen, wenn ich zur ersten Aktivität zurückkehre?
Zusammenfassung
1) Eine Aktivität => Element im Menü drücken> Minimieren anzeigen> Tastatur einblenden> Text antippen> senden> Tastatur ausblenden> Aktivität B starten.
2) B activity => setCustomView in der Aktionsleiste> Tastatur nur anzeigen, wenn der Edittext aktiviert / angeklickt ist> Text antippen> senden> Tastatur verbergen> Inhalt aktualisieren> Home-Taste drücken> zu A activity zurückkehren
3) Eine Aktivität => "leerer" Bildschirm> Bildschirm verschwindet.
Jede Hilfe wird sehr geschätzt.
Vielen Dank für Ihre Zeit.
BEARBEITEN
Ich füge meinen Code meiner ersten Klasse hinzu, um zu sehen, ob mir jemand sagt, was ich falsch mache. Vielleicht ist es mein Code, der das Problem verursacht.
Menü (ActionView)
ActionBar actionBar;
MenuItem itemSearchAction;
EditText mSearchEdit;
InputMethodManager mImm;
@Override
public boolean onCreateOptionsMenu(final Menu menu) {
getSupportMenuInflater().inflate(R.menu.main, menu);
itemSearchAction = menu.findItem(R.id.action_search);
View v = (View) itemSearchAction.getActionView();
mSearchEdit = (EditText) v.findViewById(R.id.SearchEdit);
itemSearchAction.setOnActionExpandListener(this);
return true;
}
OnActionExpandListener
@Override
public boolean onMenuItemActionExpand(MenuItem item) {
actionBar.setIcon(R.drawable.ic_app_search); // change icon
mSearchEdit.requestFocus(); // set focus on edittext
openKeyboard(); // the method above
mSearchEdit.setOnEditorActionListener(new OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
if (actionId == EditorInfo.IME_ACTION_SEARCH || (event != null && event.getKeyCode() == KeyEvent.KEYCODE_ENTER)) {
closeKeyboard(); // same method as above
// new Intent() to second activity
// perform with startActivity();
itemSearchAction.collapseActionView(); // collapse view
return true;
}
return false;
}
});
// add a clicklistener to re-open the keyboard on lower versions
mSearchEdit.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
openKeyboard();
}
});
return true;
}
@Override
public boolean onMenuItemActionCollapse(MenuItem item) {
actionBar.setIcon(R.drawable.ic_app_logo); // change icon again
if(!(mSearchEdit.getText().toString().equals("")))
mSearchEdit.setText(""); // reinitial the edittext
return true;
}
OnOptionsItemSelected
// I had this verification when I make new Intent() to
// a new activity, just in case (works like a charm)
if(itemSearchAction.isActionViewExpanded())
itemSearchAction.collapseActionView();
ActionView (Element + Layout)
<item
android:id="@+id/action_search"
android:icon="@drawable/ic_app_search"
android:title="@string/action_search"
android:showAsAction="ifRoom|collapseActionView"
android:actionLayout="@layout/search_actionview" />
<EditText
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/SearchEdit"
android:layout_width="fill_parent" android:layout_height="wrap_content"
android:layout_gravity="right|bottom" android:gravity="left"
android:layout_marginBottom="6dip"
android:hint="@string/action_search"
android:textColor="@color/white"
android:textColorHint="@color/white"
android:singleLine="true"
android:cursorVisible="true"
android:inputType="text"
android:imeOptions="actionSearch|flagNoExtractUi"
android:imeActionLabel="@string/action_search"
android:focusable="true" android:focusableInTouchMode="true"
android:background="@drawable/bt_edit_searchview_focused" >
<requestFocus />
</EditText>
AKTUALISIEREN
Ich sehe viele ähnliche Probleme mitEditText
imActionBar
Dadurch wird die Tastatur nicht angezeigt, obwohl der Fokus gesetzt wurde. Ich habe es noch einmal versucht (auch wenn ich es schon mehrmals getestet habe):
/*
* NOT WORKING
* Sources: https://stackoverflow.com/questions/11011091/how-can-i-focus-on-a-collapsible-action-view-edittext-item-in-the-action-bar-wh
* https://stackoverflow.com/a/12903527/2668136
*/
int mode = WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE;
getWindow().setSoftInputMode(mode);
postDelayed() to show: .showSoftInput(mSearchEdit, InputMethodManager.SHOW_IMPLICIT); - 200ms (Not working on lower versions)
postDelayed() to hide: .hideSoftInputFromWindow(mSearchEdit.getWindowToken(), 0); - 200ms
new Runnable() on edittext => requestFocus() + showSoftInput(SHOW_IMPLICIT/FORCED/HIDE_NOT_ALWAYS/HIDE_IMPLICIT_ONLY)
Es scheint nur bei mirSHOW_FORCED|HIDE_IMPLICIT_ONLY
kann erzwingen, dass die Tastatur automatisch angezeigt wird, wenn die Ansicht geschlossen wird. Danach muss ich in allen Versionen eine machenhideSoftInputFromWindow
auf 0, um es zu verstecken.
ABER Dies zeigt die Tastatur auch dann nicht an, wenn der Edittext gedrückt wird, und ich fügte eine hinzuClickListener
um die Tastatur wieder zum Anzeigen zu zwingen (dies geschieht nur bei niedrigeren Versionen).
UPDATE2:
Es ist eindeutig komisch, wenn ich versuche, ein bisschen zu machenThread
Wie ich in vielen SO-Antworten (mit / ohne ABS) gesehen habe, passiert in niedrigeren Versionen nichts.
Ich habe es anders versucht. Ich habe den neuen Thread erstellt, um kurz vor dem Aufruf die neue Absicht zum Ausblenden der Tastatur zu haben. Ich hatte die Tastatur, die zum Schließen gezwungen wurde, OK. Und dann habe ich die neue Aktivität geöffnet, OK. Aber jetzt, wenn ich zurückkomme, lohnt es sich! Der "leere" Raum ist auch auf niedrigeren Versionen, wenn ich zurückkomme. Ich tat dies:
// close the keyboard before intent
closeKeyboard();
// make the intent after 500 ms
Handler handler = new Handler();
Runnable runner = new Runnable() {
public void run() {
// new intent with startActivity()
}
};
handler.postDelayed(runner, 500);
// collapse the View
itemSearchAction.collapseActionView();
Es gibt mir Kopfschmerzen! Ich verstehe nicht, warum in meinem Fall der obige Tipp nicht funktioniert, wohingegen bei anderen Antworten, bei denen ein neuer Thread zum Anzeigen / Ausblenden der Tastatur verwendet wird, dies perfekt funktioniert.
HINWEIS: Meine Tests liefen(Emulator:) GalaxyNexus, NexusS, NexusOne und(echte Geräte :) Samsung GalaxySL (2.3.6) und Nexus4 (4.4).
Wenn mir jemand in dieser hässlichen Situation helfen kann. Danke im Voraus.