5

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:

Left=Second Activity: I press the Up Home Button - the keyboard disappears properly. Right=(back to) First Activity: my ListView is covered by a "empty" screen (background color in my application) and it disappears.

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.

+0

tenta di aggiungere 'GetWindow() setSoftInputMode (WindowManager.LayoutParams.. SOFT_INPUT_STATE_ALWAYS_HIDDEN); 'nel metodo 'onCreate' dell'Attività A e vedi. – SSS

+0

L'ho usato in 'onCreate' più i due metodi, ma non cambia nulla. Ancora lo spazio vuoto quando torno. – Fllo

risposta

2

Hai provato questo?

setContentView(R.layout.activity_direction_3); 
    getWindow().getDecorView().setBackgroundColor(
      android.R.color.transparent); 
+0

Funziona ... Grazie! –

1

Rimuovere traslucido:

android:theme="@style/Theme.AppCompat.Translucent" 

e utilizzare il Activity in manifest.xml come:

<activity 
    android:name=".SearchActivity" 
    android:screenOrientation="portrait"> 
+0

Molto tempo dopo, non ho usato il tema 'Translucent' nel mio tema. – Fllo

Problemi correlati