2012-07-17 10 views
5

EDIT: Risolto. Risposta inviata separatamente sottoTastiera Android ancora visibile dopo l'avvio E-mail intent

Sto lanciando il selettore "Intent.ACTION_SEND" incorporato in modo che l'utente possa selezionare come inviare un messaggio dalla mia applicazione. Funziona OK, ma se premo 'Discard' nel programma Email lanciato, ritorna alla mia applicazione con la tastiera su schermo ancora visibile. Ho provato a chiuderlo con vari incantesimi di imm.hideSoftInputFromWindow (...) ma senza successo. Qualche idea su come risolvere questo problema?

Questo è il modo in cui sto lanciando il "selettore" e tentando di chiudere la tastiera in onActivityResult(). Nota che tabHost è un membro statico nella mia applicazione principale (MainApp) che contiene l'oggetto tabHost utilizzato per creare tabSpecs.

public class L_Secondary extends ListActivity implements myConst 
{ 
    @Override 
    protected void onCreate (Bundle savedInstanceState) 
    { 
    super.onCreate (savedInstanceState); 
    setContentView(R.layout.l_people_secondary); 

    // instantiate the custom array adapter class and pass it some info to build a ListView with. 
    ListView lv = getListView(); 
    lv.setOnItemClickListener (oicl); 
    A_secondary da = new A_secondary (this, android.R.layout.simple_list_item_single_choice, mPiecesArray, mPartsArray); 

    setListAdapter (da); 
    } 

    ... 


    // after launching the email client, the keyboard stays visible 
    // over the Listview. Currently the keyboard gets forced to close 
    // in getView() of the ArrayAdapter class da, in onCreate() above     
    public void launchEmail() 
    { 
    try 
    { 
    // use the builtin chooser for users mail app 
    Intent sendIntent = new Intent(Intent.ACTION_SEND, Uri.fromParts ("mailto", "[email protected]", null)); 
    sendIntent.setType("text/plain");  

    sendIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, "msg_subject"); 
    sendIntent.putExtra(android.content.Intent.EXTRA_TEXT, "msg_body"); 

    startActivityForResult (Intent.createChooser(sendIntent, "Send via which Application?"), 0); 
    } 
    catch (Exception e) 
    { 
    Toast.makeText (this, "No activity was found to handle this action",Toast.LENGTH_SHORT).show(); 
    } 
    } 

... 

} 

risposta

0

ho finito per usare il contesto passato a GetView() nella mia classe ArrayAdapter che è un'istanza della classe L_Secondary. Non è il posto migliore per farlo perché ogni volta che l'elenco viene fatto scorrere, sfiorato o spostato, è necessario verificare che la tastiera sia visibile e chiuderla in caso affermativo. Nondimeno, è un inizio. Da qui posso provare a trovare un posto più efficiente per metterlo.

@Override 
public View getView (int position, View convertView, ViewGroup parent) 
{ 
    View row = convertView; 
    Context ctx = parent.getContext(); 

    if (row == null) 
    { 
     LayoutInflater inflater = ((Activity) ctx).getLayoutInflater(); 
     row = inflater.inflate (R.layout.li_secondary, parent, false); 
    } 

    // hide the keyboard when coming back from Email client Intent 
    InputMethodManager imm = (InputMethodManager) ctx.getSystemService(Context.INPUT_METHOD_SERVICE); 
    if (imm.isActive() == true) 
     imm.hideSoftInputFromWindow (MainApp.tabHost.getCurrentTabView().getApplicationWindowToken(),imm.HIDE_NOT_ALWAYS); 
    ... 
} 
+0

Perché funziona?Devo capire per cercare di usarlo nella mia situazione. – Poutrathor

0

Usa questo codice prima di chiamare un intento di MAIL // ed è EditText

InputMethodManager imm = (InputMethodManager)this.getSystemService(Service.INPUT_METHOD_SERVICE); 

per nascondere la tastiera

imm.hideSoftInputFromWindow(ed.getWindowToken(), 0); 

per mostrare la tastiera

imm.showSoftInput(ed, 0); 

prova Questo codice sul metodo onRestart() così

O

si può provare anche questo

<activity android:name=".YourActivity" 
      android:windowSoftInputMode="stateHidden"></activity> 

Grazie.

+0

vorrei provare questo, ma non ho un EditText nel mio ListView. Sperimenterò grazie. – wufoo

+0

Ho modificato il mio codice per un'altra soluzione in caso di assenza di testo di modifica nel tuo elencoAttività. Grazie – SALMAN

+0

Grazie. Ho impostato set di stato, ma ancora senza fortuna. – wufoo

0

Credo che si potrebbe chiamare il metodo hideSoftInputFromWindow in onResume()

protected void onResume() 
{ 
    InputMethodManager keyboard = (InputMethodManager) 
    getSystemService(Context.INPUT_METHOD_SERVICE); 
    keyboard.hideSoftInputFromWindow(userInput.getWindowToken(), 0); 
} 
+0

Perché è downvoted? – Leon

+0

Non sono sicuro, ma se sto facendo qualcosa di sbagliato, per favore fatemi sapere –

+0

cosa è userInput? –

2

ho trovato questo ha funzionato per me aggiungendolo al mio onResume()

protected void onResume() 
{ 
    Handler h = new Handler(); 
    h.postDelayed(new Runnable() { 
    @Override 
    public void run() { 
     InputMethodManager keyboard = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); 
     keyboard.hideSoftInputFromWindow(findViewById(android.R.id.content).getWindowToken(), 0); 
    } 
    }, 500); 
} 
+0

unica cosa che ha funzionato ... – peresisUser

+0

Puoi anche scrivere questo in onActivityResult() anziché onResume(). –

Problemi correlati