2011-11-10 27 views
55

En mi opinión, tengo una EditarTexto búsqueda y me gustaría desencadenar programación el comportamiento de un evento click en el campo, es decir, dar el foco al campo de texto y mostrar teclado en pantalla si necesario (si no hay un teclado duro disponible).TextField Android: ajustar el enfoque + entrada de software mediante programación

me trataron field.requestFocus(). El campo en realidad se enfoca pero el teclado suave no se muestra.

me trataron field.performClick(). Pero eso solo llama al OnClickListener del campo.

¿Alguna idea?

Respuesta

118

Buen señor, intente esto:

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

No estoy seguro, pero esto puede ser necesario en algunos teléfonos (algunos de los dispositivos más antiguos):

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

mismo resultado que requestFocus() por sí sola ... El campo se centrará pero el teclado en pantalla no se dispara – fiddler

+8

Finalmente resolví el emitido llamando 'field.requestFocus()' en el método 'onResume()' de la actividad (en lugar de 'onCreate()'). No sé exactamente por qué funciona ... – fiddler

+25

Una vista no puede enfocar antes de que realmente se haya distribuido en la pantalla. Esto no se puede hacer mientras que onCreate() contiene el hilo de UI, por lo tanto, la vista se presenta directamente después de onCreate() y antes de onResume(). :) – pgsandstrom

43

Este es el código que funcionó para mi.

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

Eso es todo! Disfrutar;)

+0

Gracias y este me funcionó. Agrego 'EditText' programmatically cuando el usuario pulsa el botón. – dumbfingers

+0

Agregué un 'EditText' desde un diálogo modal. Algunas banderas se están configurando por Android que hacen que este control no reciba ningún toque. Si agrega el campo en el ejecutable, los indicadores no se configuran. – JeffRegan

+0

Parece que el 'InputType' de' EditText' se está estableciendo como nulo por Android. Si configura el 'InputType', debería funcionar. – JeffRegan

4

El siguiente código trabajó para mí, después de que los otros dos respuestas no funcionó para mí:

@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 
} 

Dónde ShowKeyboard es

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); 
    } 
} 

Después de una entrada exitosa, también me aseguro de ocultar el teclado

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

Técnicamente, me acaba de agregar 300 ms de retardo antes de ejecutar la solicitud de visualización teclado en pantalla. Raro, ¿verdad? También cambió requestFocus() a requestFocusFromTouch().

EDITAR: No usar requestFocusFromTouch() da un evento táctil al iniciador. Quédese con requestFocus().

Edit2: En Diálogos (DialogFragment), utilice el siguiente

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

en lugar de

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

'requestFocusFromTouch()' parece desencadenar un evento táctil en el iniciador. Esto es extraño. – 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)); 
      } 
     }); 
Cuestiones relacionadas