2011-06-22 6 views
18

sto usando 4 EditText campi e 2 filatori in un'attività. L'ordine di questi componenti è 2 EditText, quindi 2 filatori e quindi 2 campi EditText.Spinner non viene messa a fuoco

Il problema si verifica quando trasferiscono fuoco (con l'aiuto di tastiera software pulsante accanto) da EditText a trottola, filatore non ottiene la messa a fuoco e la messa a fuoco viene trasferito alla successiva EditText campo che è stato posto dopo filatori.

ho usato requestFocus() sul filatore, ma non ha funzionato.

Come posso essere sicuro il filatore ottiene fuoco?

+1

Si prega di fornire il flag di risposta. – JJD

+1

Meno 1 per non aver concesso la risposta selezionata. –

risposta

3

Questo è un salto nel buio, ma provate l'impostazione della proprietà attivabile (in formato XML o in codice; qualunque modo si sta facendo) su true sul filatore.

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

EDIT: Inoltre, si veda la domanda: Can't manage to requestFocus a Spinner

+0

Grazie ho risolto il problema: 1) Ho impostato l'oggetto Spinner in cima (all'interno del metodo onCreate) solo per assicurarmi che il mio codice venga eseguito prima. 2) Ho usato quanto segue: Spinner s1 = (Spinner) findViewById (R.id.spinner1); s1.setFocusable (true); s1.setFocusableInTouchMode (true); – Shameen

+1

@Shameen Potresti aver impostato quei flag in XML. –

19

Grazie, ho risolto effettuando le seguenti operazioni:

  1. I impostare l'oggetto Spinner sopra (nel metodo onCreate) solo per assicurarmi che il mio codice venga eseguito prima
  2. Ho usato il seguente:

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

Hai chiaramente ottenuto la soluzione da @shanet, quindi dovresti aver appena selezionato la risposta. –

31

sono riuscito a trovare una soluzione diversa allora riposizionamento mia Spinner. Nel EditText prima la filatrice, aggiungere questo ascoltatore:

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

È inoltre necessario aggiungere queste righe a ogiva in grado di ottenere attenzione:

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

La mia funzione hideKeyboard era solo un dettaglio visivo che Volevo aggiungere la tastiera per nasconderti:

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

Spero di aver aiutato in questa domanda complicata.
La bandiera InputMethodManager.HIDE_NOT_ALWAYS può essere found in the documentation.

+1

Non è necessario impostare focusableInTouchMode? –

+0

Sarebbe utile impostare focusableInTouchMode. Inoltre, sembrava non funzionare se si prova in XML, provare a livello di programmazione. –

+0

Fantastico grazie !!!! –

0

Ho appena avuto lo stesso problema. L'ho risolto usando le proprietà 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"/> 

Ma perché questo è anche necessario ... mi batte.