Ho un ActionView
con la voce di menu sul ActionBar
(usando ActionBarSherlock), sono in grado di visualizzare un EditText
come un campo di ricerca in esso. È un input per lanciare un altro in ActionBar che visualizza lo stesso layout (non uso nulla per forzare l'SoftKeyboard
a comparire in questa seconda attività, non ci sono problemi qui). Quando voglio fare appare la tastiera virtuale/disapears automaticamente quando il crollo vista in prima attività, io uso:Spazio vuoto quando tornerò in attività (tastiera software forzata)
metodo openKeyboard
mImm.toggleSoftInput(InputMethodManager.SHOW_FORCED, InputMethodManager.HIDE_IMPLICIT_ONLY);
metodo closeKeyboard
mImm.hideSoftInputFromWindow(edittext.getWindowToken(), 0);
I utilizzare ActionExpandListener
per far apparire o scomparire il SoftKeyboard quando lo View
si espande o si contrae. Con questi due metodi sopra, ho il risultato atteso. Ho trovato questo su diverse domande su SO (in particolare su Close/hide the Android Soft Keyboard e Showing the soft keyboard for SearchView on ActionBar o Forcing the Soft Keyboard open).
Giusto per capire, quando ho usato SHOW_IMPLICIT
o SHOW_FORCED
da solo, non ha avuto alcun effetto sulle versioni inferiori (come 2. +). Il testo EditText era focalizzato ma la tastiera non veniva visualizzata (quindi, immagino fosse una cosa brutta). Nelle versioni recenti (come 4. + per esempio), è stato un bell'effetto e nessun problema. Quindi, ho forzato la tastiera a presentarsi con il metodo openKey precedente.
Ora, ho avuto qualche problema con questo ...
Sulle versioni più bassi, ho avuto spazio "vuoto" prima e dopo la tastiera creato/distrutto, posso vivere con questo. MA nelle versioni recenti, ho ottenuto lo spazio "vuoto" visualizzato quando I torna alla prima attività. Ed è qui per meno di un secondo, ma è sufficiente per vederlo!
Per capire meglio cosa succede, vedere l'immagine qui sotto:
1. Seconda azione: si preme il pulsante Up Home - la tastiera scompare correttamente.
2. (torna a) Prima attività: il mio ListView è coperto da uno spazio "vuoto" (colore di sfondo nella mia applicazione). E scompare (questa è la stessa altezza del SoftKeyboard, alcun dubbio!)
Credo che sia perché ho costretto la tastiera per apparire nella mia prima attività anche se ho anche costretto la tastiera per nascondere quando vado il secondo, ma come posso risolvere lo spazio "vuoto" quando torno alla prima attività?
Sommario
1) Un'attività => voce di stampa a Menu> Visualizza crollo> visualizzare la tastiera> Testo toccare> inviarlo> nascondere i tasti> attività di lancio B.
2) B attività => setCustomView in actionbar> mostra la tastiera solo se l'edittext è focalizzato/cliccato> tocca testo> invia> nascondi tastiera> aggiorna contenuto> premi home pulsante> torna a A attività
3) Un'attività => la schermata "vuoto"> scompare.
Qualsiasi aiuto sarà molto apprezzato.
Grazie per il vostro tempo.
EDIT
aggiungo il mio codice della mia prima classe, per vedere se qualcuno mi dice che cosa sto facendo male. Forse è il mio codice che rende il problema.
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;
}
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 (voce + 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>
UPDATE
Vedo un sacco di problemi simili, con EditText
in ActionBar
che non fa apparire la tastiera anche se è stata impostata la messa a fuoco. Ho provato questo nuovo (anche se ho già provato più volte):
/*
* 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)
Sembra con me, solo SHOW_FORCED|HIDE_IMPLICIT_ONLY
può forzare la tastiera per visualizzare automaticamente quando il crollo vista. Dopo questo, in tutte le versioni, devo rendere un hideSoftInputFromWindow
a 0 per nasconderlo.
MA questo non visualizza la tastiera anche se si preme l'edittext, quindi ho aggiunto un ClickListener
per forzare la visualizzazione della tastiera (ciò accade solo nelle versioni inferiori).
UPDATE2:
E 'chiaramente strano, quando provo a fare un po' Thread
come ho visto in molti SO risposte (con/senza ABS), non succede nulla nelle versioni inferiori.
Ho provato un modo diverso. Ho creato il nuovo thread per avere poco tempo prima di chiamare il nuovo intento per nascondere la tastiera. Ho avuto la tastiera che ha costretto a chiudere, OK. E poi ho aperto la nuova attività, OK. Ma ora quando torno, ne vale la pena! Lo spazio "vuoto" è anche nelle versioni inferiori quando torno.Ho fatto questo:
// 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();
Mi dà mal di testa! Non capisco perché nel mio caso, il suggerimento sopra non funziona mentre su altre risposte, quando usano un nuovo thread per mostrare/nascondere la tastiera, questo funziona perfettamente.
NOTA: mie prove erano in (emulatore :) GalaxyNexus, NexusS, NexusOne e (dispositivi reali :) Samsung GalaxySL (2.3.6) e Nexus4 (4.4).
Se qualcuno può aiutarmi con questa brutta situazione. Grazie in anticipo.
tenta di aggiungere 'GetWindow() setSoftInputMode (WindowManager.LayoutParams.. SOFT_INPUT_STATE_ALWAYS_HIDDEN); 'nel metodo 'onCreate' dell'Attività A e vedi. – SSS
L'ho usato in 'onCreate' più i due metodi, ma non cambia nulla. Ancora lo spazio vuoto quando torno. – Fllo