Puste miejsce po powrocie do aktywności (wymuszona miękka klawiatura)
mamActionView
z opcją menuActionBar
(za pomocąAkcjaBarSherlock), Jestem w stanie wyświetlićEditText
jako pole wyszukiwania w nim. To wejście do uruchomienia kolejnegoActivity
zCustomView
w ActionBar, który wyświetla ten sam układ (nie używam niczego, by wymusićSoftKeyboard
aby pojawić się w tym drugim działaniu, nie ma tu problemu). Kiedy chcę, aby Klawiatura Soft pojawiła się / zniknęła automatycznie, gdy widok zawali się przy pierwszym działaniu, używam:
metoda openKeyboard
mImm.toggleSoftInput(InputMethodManager.SHOW_FORCED, InputMethodManager.HIDE_IMPLICIT_ONLY);
metoda closeKeyboard
mImm.hideSoftInputFromWindow(edittext.getWindowToken(), 0);
używamActionExpandListener
aby SoftKeyboard pojawił się lub zniknął, gdyView
rozszerza się lub zapada. Mając powyższe dwie metody, mam oczekiwany rezultat. Znalazłem to w kilku pytaniach dotyczących SO (zwłaszcza w sprawieZamknij / ukryj miękką klawiaturę Android iPokazuje klawiaturę programową dla SearchView na ActionBar lubWymuszanie otwarcia miękkiej klawiatury).
Po prostu zrozumieć, kiedy użyłemSHOW_IMPLICIT
lubSHOW_FORCED
sam nie miał wpływu na niższe wersje (jako 2. +). EditText był skupiony, ale klawiatura nie pojawiła się (więc zgadujesz, że była to zła rzecz). W ostatnich wersjach (na przykład w wersji 4. +) był to niezły efekt. Potem zmusiłem klawiaturę, by pojawiła się zmetoda openKeyboard powyżej.
Teraz mam z tym kłopoty ...
W niższych wersjach otrzymałem „pustą” przestrzeń przed i po utworzeniu / zniszczeniu klawiatury, mogę z tym żyć.ALE w ostatnich wersjach dostałem „pustą” przestrzeń, którą wyświetla, gdy japowróć do pierwszego działania. I jest tutaj w czasie krótszym niż jedna sekunda, ale wystarczy, aby to zobaczyć!
Aby lepiej zrozumieć, co się dzieje, zobacz poniższy obrazek:
1 Drugie działanie: Naciskam górny przycisk Home - klawiatura znika prawidłowo.
2. (wróć do) Pierwsza aktywność: mój ListView jest objęty „pustą” przestrzenią (kolor tła w mojej aplikacji). I znika(to jest ta sama wysokość SoftKeyboard, bez wątpienia!)
Chyba dlategoZmusiłem klawiaturę do pojawienia się w mojej pierwszej działalnościchociaż zmusiłem klawiaturę do ukrycia się kiedy idę drugi, ale jak mogę rozwiązać „pustą” przestrzeń po powrocie do pierwszej aktywności?
streszczenie
1) A activity => naciśnij element w menu> view collapse> pokaż klawiaturę> stuknij tekst> wyślij go> ukryj klawiaturę> uruchom aktywność B.
2) B activity => setCustomView w pasku akcji> pokaż klawiaturę tylko wtedy, gdy edittext jest skupiony / kliknięty> stuknij tekst> wyślij go> ukryj klawiaturę> odśwież zawartość> naciśnij przycisk home> powróć do działania A
3) Ekran aktywności => "pusty"> ekran znika.
Każda pomoc będzie bardzo wdzięczna.
Dziękuję za Twój czas.
EDYTOWAĆ
Dodaję swój kod mojej pierwszej klasy, aby sprawdzić, czy ktoś mówi mi, co robię źle. Może to mój kod sprawia, że problem.
Menu (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;
}
OnActionRozwińListener
@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 + układ)
<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>
AKTUALIZACJA
Widzę wiele podobnych problemówEditText
wActionBar
co nie sprawia, że klawiatura się pojawia, nawet ostrość została ustawiona. Próbowałem tego jeszcze raz (nawet jeśli testowałem już kilka razy):
/*
* 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)
Wydaje mi się tylko ze mnąSHOW_FORCED|HIDE_IMPLICIT_ONLY
może wymusić automatyczne wyświetlanie klawiatury, gdy widok się zwija. Po tym, we wszystkich wersjach, muszę zrobićhideSoftInputFromWindow
do 0, aby to ukryć.
ALE to wyświetla klawiaturę, nawet jeśli edittext jest wciśnięty, więc dodałemClickListener
aby zmusić klawiaturę do ponownego wyświetlenia (dzieje się tak tylko w niższych wersjach).
UPDATE2:
To wyraźnie dziwne, kiedy próbuję zrobić trochęThread
tak jak widziałem w wielu odpowiedziach SO (z / bez ABS), nic nie dzieje się w niższych wersjach.
Próbowałem inaczej. Stworzyłem nowy wątek, aby mieć krótki czas przed wywołaniem nowego zamiaru ukrycia klawiatury. Miałem klawiaturę, która musiała się zamknąć, OK. A potem otworzyłem nową działalność, OK. Ale teraz, kiedy wrócę, warto! „Pusta” przestrzeń jest także w niższych wersjach, kiedy wrócę. Ja to zrobiłem:
// 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();
To daje mi bóle głowy! Nie rozumiem, dlaczego w moim przypadku powyższa wskazówka nie działa, podczas gdy w innych odpowiedziach, gdy używają nowego wątku do pokazywania / ukrywania klawiatury, działa to idealnie.
UWAGA: moje testy były w toku(emulator :) GalaxyNexus, NexusS, NexusOne i(prawdziwe urządzenia :) Samsung GalaxySL (2.3.6) i Nexus4 (4.4).
Jeśli ktoś może mi pomóc w tej brzydkiej sytuacji. Z góry dziękuję.