2011-11-10 12 views
55

Dal mio punto di vista, ho una ricerca in EditText e vorrei attivare a livello di codice il comportamento di un evento click sul campo, cioè dare fuoco al campo di testo E visualizzare tastiera virtuale se necessario (se nessuna tastiera è disponibile).TextField Android: imposta fuoco + input programmatico a livello di programmazione

Ho provato field.requestFocus(). Il campo diventa effettivamente attivo ma la tastiera non viene visualizzata.

Ho provato field.performClick(). Ma questo chiama solo l'OnClickListener del campo.

Qualche idea?

risposta

118

Buon signore, provate questo:

edittext.setFocusableInTouchMode(true); 
edittext.requestFocus(); 

non sono sicuro, ma questo potrebbe essere richiesto su alcuni cellulari (alcuni dei dispositivi più vecchi):

final InputMethodManager inputMethodManager = (InputMethodManager) context 
       .getSystemService(Context.INPUT_METHOD_SERVICE); 
inputMethodManager.showSoftInput(edittext, InputMethodManager.SHOW_IMPLICIT); 
+2

stesso risultato di requestFocus() da solo ... Il campo si concentrerà ma la tastiera virtuale non è attivato – fiddler

+8

Ho finalmente risolto il problema chiamando 'field.requestFocus()' nel metodo 'onResume()' dell'attività (invece di 'onCreate()'). Non so esattamente perché funzioni ... – fiddler

+25

Una vista non può essere messa a fuoco prima che sia effettivamente disposta sullo schermo. Questo non può essere fatto mentre onCreate() mantiene il thread dell'interfaccia utente, quindi la vista viene visualizzata direttamente dopo onCreate() e prima onResume(). :) – pgsandstrom

43

Qui è il codice che ha funzionato per me.

edittext.post(new Runnable() { 
    public void run() { 
     edittext.requestFocusFromTouch(); 
     InputMethodManager lManager = (InputMethodManager)getActivity().getSystemService(Context.INPUT_METHOD_SERVICE); 
     lManager.showSoftInput(edittext, 0); 
    } 
}); 

Questo è tutto! Godere;)

+0

Grazie e questo ha funzionato per me. Aggiungo 'EditText' a livello di codice quando l'utente preme il pulsante. – dumbfingers

+0

Ho aggiunto un 'EditText' da una finestra di dialogo modale. Alcune bandiere vengono impostate da Android che impediscono a questo controllo di ricevere alcun tocco. Se aggiungi il campo nel runnable, i flag non vengono impostati. – JeffRegan

+0

Sembra che il 'InputType' di' EditText' sia impostato su null da Android. Se imposti il ​​'InputType', dovrebbe funzionare. – JeffRegan

4

Il seguente codicelavorato per me, dopo le altre due rispostenon ha funzionato per me:

@Override 
public void onResume() { 
    super.onResume(); 
    SingletonBus.INSTANCE.getBus().register(this); 
    //passwordInput.requestFocus(); <-- that doesn't work 
    passwordInput.postDelayed(new ShowKeyboard(), 300); //250 sometimes doesn't run if returning from LockScreen 
} 

Dove ShowKeyboard è

private class ShowKeyboard implements Runnable { 
    @Override 
    public void run() { 
     passwordInput.setFocusableInTouchMode(true); 
    //  passwordInput.requestFocusFromTouch(); 
     passwordInput.requestFocus();    
     getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE); 
     ((InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE)).showSoftInput(passwordInput, 0); 
    } 
} 

Dopo un inserimento riuscito, mi assicuro anche di nascondere la tastiera

getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN); 
((InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE)) 
        .hideSoftInputFromWindow(getView().getWindowToken(), 0); 

Tecnicamente, ho appena aggiunto 300 ms di ritardo prima di eseguire la richiesta di visualizzazione della tastiera virtuale. Strano, vero? Anche modificato requestFocus() a requestFocusFromTouch().

MODIFICA: non utilizzare requestFocusFromTouch() dà un evento tocco al programma di avvio. Attacca con requestFocus().

EDIT2: nelle finestre di dialogo (DialogFragment), utilizzare il seguente

getDialog().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE); 

invece di

getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE); 
+0

'requestFocusFromTouch()' sembra attivare un evento di tocco sul programma di avvio. Questo è strano – EpicPandaForce

0
 field.post(new Runnable() { 
      @Override 
      public void run() { 
       field.requestFocus(); 
       field.onKeyUp(KeyEvent.KEYCODE_DPAD_CENTER, new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_DPAD_CENTER)); 
      } 
     }); 
Problemi correlati