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ę.

questionAnswers(2)

yourAnswerToTheQuestion