2011-06-22 16 views
18

Estoy usando 4 EditText campos y 2 spinners en una actividad. El orden de estos componentes es 2 EditText, luego 2 hilanderos y luego 2 EditText campos.Spinner no obtiene el foco

El problema ocurre cuando transfiero el foco (con la ayuda del botón suave del teclado siguiente) de EditText a la ruleta, el ruteador no capta el foco y el foco se transfiere al siguiente campo EditText que se colocó detrás de los giradores.

He utilizado requestfocus() en el spinner, pero no funcionó.

¿Cómo me aseguro de que la ruleta se enfoque?

+1

Agregue la bandera de respuesta. – JJD

+1

Menos 1 por no otorgar la respuesta seleccionada. –

Respuesta

3

Se trata de una toma en la oscuridad, pero intente configurar la propiedad enfocable (en XML o en código, sea cual sea su forma de hacerlo) en true en la ruleta.

http://developer.android.com/reference/android/view/View.html#attr_android:focusable

EDIT: También, vea esta pregunta: Can't manage to requestFocus a Spinner

+0

thanx lo he resuelto haciendo lo siguiente: 1) Configuré el objeto Spinner en la parte superior (dentro del método onCreate) solo para asegurarme de que mi código se ejecuta primero. 2) Usé lo siguiente: Spinner s1 = (Spinner) findViewById (R.id.spinner1); s1.setFocusable (verdadero); s1.setFocusableInTouchMode (verdadero); – Shameen

+1

@Shameen Podría haber establecido esos indicadores en XML. –

19

Gracias, he resuelto de la siguiente manera:

  1. puse el objeto giratorio en la parte superior (en el método onCreate) solo para asegurarme de que mi código se ejecuta primero
  2. Utilicé lo siguiente:

    Spinner s1 = (Spinner) findViewById(R.id.spinner1); 
    s1.setFocusable(true); 
    s1.setFocusableInTouchMode(true); 
    s1.requestFocus(); 
    
+0

Obviamente obtuvo la solución de @shanet por lo que debería haber seleccionado su respuesta. –

31

he conseguido encontrar una solución distinta a continuación, el reposicionamiento de mi Spinner. En el EditarTexto antes la ruleta, añadir este oyente:

editTextBefore.setOnEditorActionListener(new OnEditorActionListener() { 
    @Override 
    public boolean onEditorAction(TextView textView, int actionId, KeyEvent event) { 
     if (actionId == EditorInfo.IME_ACTION_NEXT) { 
      hideKeyboard(); 
      textView.clearFocus(); 
      spinner.requestFocus(); 
      spinner.performClick(); 
     } 
     return true; 
    } 
}); 

También es necesario añadir estas líneas a spinner capaz de obtener el foco:

spinner.setFocusable(true); // can be done in XML preferrable 

Mi función hideKeyboard era sólo un detalle visual que quería añadir por lo que el teclado quedan ocultos:

private void hideKeyboard() { 
    InputMethodManager inputManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); 
    inputManager.hideSoftInputFromWindow(this.getCurrentFocus().getWindowToken(), 
      InputMethodManager.HIDE_NOT_ALWAYS); 
} 

espero haber ayudado en esta difícil cuestión.
La bandera InputMethodManager.HIDE_NOT_ALWAYS puede ser found in the documentation.

+1

No tiene que establecer focusableInTouchMode? –

+0

Sería útil establecer focusableInTouchMode. Además, parecía no funcionar si intentas esto en XML, prueba programáticamente. –

+0

Gracias increíbles !!!! –

0

Acabo de tener el mismo problema. Lo resolví usando las propiedades nextFocusDown/Up/Left/Right.

<EditText 
    android:id="@+id/tPhone" 
    ... 
    android:focusableInTouchMode="true" 
    android:focusable="true" 
    android:nextFocusDown="@+id/sCountry"/> 

<Spinner 
    android:id="@+id/sCountry" 
    .... 
    android:focusableInTouchMode="true" 
    android:focusable="true" 
    android:nextFocusUp = "@+id/tPhone" 
    android:nextFocusDown="@+id/tStreet"/> 

<EditText 
    android:id="@+id/tStreet" 
    ... 
    android:visibility="gone" 
    android:focusableInTouchMode="true" 
    android:focusable="true" 
    android:nextFocusUp = "@+id/sCountry"/> 

Pero por qué esto es incluso necesario ... me gana.

Cuestiones relacionadas