2010-11-22 4 views
2

Ich habe ein Problem mit Spinner in einer Form Aktivität.Spinner und Fokus

Ich habe erwartet, dass ein Spinner den Fokus erhält, wenn ein Benutzer ihn "berührt", aber das scheint nicht zu passieren. Ein Spinner scheint nur zu fokussieren, wenn ich meinen Trackball (auf einem Nexus One) verwende, um zwischen den verschiedenen Komponenten zu wechseln.

Das ist ärgerlich, weil ich das Attribut android: selectAllOnFocus = "true" in der ersten EditText-Ansicht im Formular verwende. Da die Spinner niemals den Fokus von der EditText-Komponente weg nehmen, wird ihr Inhalt immer hervorgehoben (was hässlich IMO ist).

Ich habe versucht,

spinner.requestFocus();

verwenden, aber diese (scheinbar) keine Wirkung.

Ich habe versucht, auf dem Spinner in einem AdapterView.OnItemSelectedListener Fokus anfordert, aber seine Ergebnisse nur in

Window already focused, ignoring focus gain of: [email protected]

Kann jemand dieses seltsame Verhalten und/oder mögliche Wege, um es erklären.

Vielen Dank,

Tim

+0

Ich habe das gleiche Verhalten in meinem Formular, aber mein Formular läuft aus irgendeinem Grund Ich bekomme diese Warnung jedes Mal, wenn ich etwas aus dem Spinner auswählen. – JPM

Antwort

1

Sie haben setFocusableInTouchMode() zuerst zu verwenden. Dann stoßen Sie auf ein anderes Problem: Sie müssen zweimal auf den Spinner tippen, um ihn zu ändern (einmal, um den Fokus zu setzen, dann erneut, um die Liste der Optionen zu sehen). Meine Lösung ist meine eigenen Spinner Unterklasse zu erstellen, die den Fokus Gewinn aus dem ersten Abgriff bewirkt, dass der zweiter simulieren:

class MySpinnerSubclass extends Spinner { 

    private final OnFocusChangeListener clickOnFocus = new OnFocusChangeListener() { 

     @Override 
     public void onFocusChange(View v, boolean hasFocus) { 

      // We don't want focusing the spinner with the d-pad to expand it in 
      // the future, so remove this listener until the next touch event. 
      setOnFocusChangeListener(null); 
      performClick(); 
     } 
    }; 

    // Add whatever constructor(s) you need. Call 
    // setFocusableInTouchMode(true) in them. 

    @Override 
    public boolean onTouchEvent(MotionEvent event) { 

     int action = event.getAction(); 
     if (action == MotionEvent.ACTION_DOWN) { 

      // Only register the listener if the spinner does not already have 
      // focus, otherwise tapping it would leave the listener attached. 
      if (!hasFocus()) { 
       setOnFocusChangeListener(clickOnFocus); 
      } 
     } else if (action == MotionEvent.ACTION_CANCEL) { 
      setOnFocusChangeListener(null); 
     } 
     return super.onTouchEvent(event); 
    } 
} 

richtigen Kredit zu geben, habe ich meine Inspiration von Kaptkaos's answer zu this question.