style - android spinner text color



Android Spinner: Vermeiden Sie onItemSelected-Aufrufe während der Initialisierung (8)

Ab API-Stufe 3 können Sie onUserInteraction () für eine Aktivität mit einem booleschen Wert verwenden, um festzustellen, ob der Benutzer mit dem Gerät interagiert.

http://developer.android.com/reference/android/app/Activity.html#onUserInteraction()

@Override
public void onUserInteraction() {
     super.onUserInteraction();
     userIsInteracting = true;
}

Als ein Feld auf der Aktivität habe ich:

 private boolean userIsInteracting;

Endlich, mein Spinner:

      mSpinnerView.setOnItemSelectedListener(new OnItemSelectedListener() {

           @Override
           public void onItemSelected(AdapterView<?> arg0, View view, int position, long arg3) {
                spinnerAdapter.setmPreviousSelectedIndex(position);
                if (userIsInteracting) {
                     updateGUI();
                }
           }

           @Override
           public void onNothingSelected(AdapterView<?> arg0) {

           }
      });

Wenn Sie die Aktivität durchlaufen und durchlaufen, wird der Boolesche Wert auf false zurückgesetzt. Klappt wunderbar.

https://code.i-harness.com

Ich habe Android-Anwendung mit einem Spinner und einem TextView . Meine Aufgabe besteht darin, das ausgewählte Element aus der Dropdown-Liste des Spinner in der Textansicht anzuzeigen. Ich habe Spinner in der onCreate Methode implementiert. Wenn ich das Programm TextView wird in der TextView ein Wert TextView (bevor ein Element aus der Dropdown-Liste ausgewählt wird).

Ich möchte den Wert in der Textansicht erst anzeigen, nachdem ich ein Element aus der Dropdown-Liste ausgewählt habe. Wie mache ich das?

Hier ist mein Code:

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
import android.widget.TextView;

public class GPACal01Activity extends Activity implements OnItemSelectedListener {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        Spinner spinner = (Spinner) findViewById(R.id.noOfSubjects);

        // Create an ArrayAdapter using the string array and a default spinner layout
        ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this,R.array.noofsubjects_array, android.R.layout.simple_spinner_item);
        // Specify the layout to use when the list of choices appears
        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        // Apply the adapter to the spinner
        spinner.setAdapter(adapter);
        spinner.setOnItemSelectedListener(this);
    }

    public void onItemSelected(AdapterView<?> parent, View arg1, int pos,long id) {
        TextView textView = (TextView) findViewById(R.id.textView1);
        String str = (String) parent.getItemAtPosition(pos);
        textView.setText(str);
    }

    public void onNothingSelected(AdapterView<?> arg0) {
        // TODO Auto-generated method stub

    }
}

Das Benutzerinteraktions-Flag kann dann in der onTouch-Methode auf true gesetzt und in onItemSelected() sobald die onItemSelected() wurde. Ich bevorzuge diese Lösung, weil das Benutzerinteraktions-Flag ausschließlich für den Spinner und nicht für andere Ansichten in der Aktivität behandelt wird, die das gewünschte Verhalten beeinflussen können.

In Code:

Erstellen Sie Ihren Listener für den Spinner:

public class SpinnerInteractionListener implements AdapterView.OnItemSelectedListener, View.OnTouchListener {

    boolean userSelect = false;

    @Override
    public boolean onTouch(View v, MotionEvent event) {
        userSelect = true;
        return false;
    }

    @Override
    public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) {
        if (userSelect) { 
            userSelect = false;
            // Your selection handling code here
        }
    }

}

Fügen Sie den Listener dem Spinner als OnItemSelectedListener und OnTouchListener :

SpinnerInteractionListener listener = new SpinnerInteractionListener();
mSpinnerView.setOnTouchListener(listener);
mSpinnerView.setOnItemSelectedListener(listener);

Eine ähnliche einfache Lösung, die mehrere Spinner ermöglicht, besteht darin, das AdapterView bei der ersten Ausführung von onItemSelected (...) in eine Auflistung in der Oberklasse "Activities" zu stellen. Dann prüfen, ob sich das AdapterView in der Sammlung befindet, bevor es ausgeführt wird. Dies aktiviert einen Satz von Methoden in der Oberklasse und unterstützt mehrere AdapterViews und daher mehrere Spinner.

Superklasse ...

private Collection<AdapterView> AdapterViewCollection = new ArrayList<AdapterView>();

   protected boolean firstTimeThrough(AdapterView parent) {
    boolean firstTimeThrough = ! AdapterViewCollection.contains(parent);
    if (firstTimeThrough) {
       AdapterViewCollection.add(parent);
     }
    return firstTimeThrough;
   }

Unterklasse ...

public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) {
      if (! firstTimeThrough(parent)) {
        String value = safeString(parent.getItemAtPosition(pos).toString());
        String extraMessage = EXTRA_MESSAGE;
        Intent sharedPreferencesDisplayIntent = new         Intent(SharedPreferencesSelectionActivity.this,SharedPreferencesDisplayActivity.class);
    sharedPreferencesDisplayIntent.putExtra(extraMessage,value);
    startActivity(sharedPreferencesDisplayIntent);
  }
  // don't execute the above code if its the first time through
  // do to onItemSelected being called during view initialization.

}


Hatte das gleiche Problem und das funktioniert für mich:

Ich habe 2 Spinner und ich aktualisiere sie während Init und während Interaktionen mit anderen Kontrollen oder nach dem Abrufen von Daten vom Server.

Hier ist meine Vorlage:

public class MyClass extends <Activity/Fragment/Whatever> implements Spinner.OnItemSelectedListener {

    private void removeSpinnersListeners() {
        spn1.setOnItemSelectedListener(null);
        spn2.setOnItemSelectedListener(null);
    }

    private void setSpinnersListeners() {
        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                spn1.setOnItemSelectedListener(MyClass.this);
                spn2.setOnItemSelectedListener(MyClass.this);
            }
        }, 1);
    }

    @Override
    public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
        // Your code here
    }

    @Override
    public void onNothingSelected(AdapterView<?> parent) {

    }
}

Wenn die Klasse beginnt , setSpinnersListeners () zu verwenden, anstatt den Listener direkt zu setzen.

Das Runnable-Objekt verhindert, dass das Drehfeld onItemSelected direkt nach dem Festlegen der Werte ausgelöst wird.

Wenn Sie den Spinner aktualisieren müssen (nach einem Serveranruf usw.), verwenden Sie removeSpinnersListeners () direkt vor Ihren Update-Zeilen und setSpinnersListeners () direkt nach den Update-Zeilen. Dies verhindert, dass onItemSelected nach dem Update ausgelöst wird.


Setzen Sie diese Zeile vor dem Festlegen von OnItemSelectedListener

spinner.setSelection(0,false)

Sie können dies auf diese Weise tun:

AdapterView.OnItemSelectedListener listener = new AdapterView.OnItemSelectedListener() {
        @Override
        public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
            //set the text of TextView
        }

        @Override
        public void onNothingSelected(AdapterView<?> adapterView) {

        }
    });

yourSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
        @Override
        public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
            yourSpinner.setOnItemSelectedListener(listener);
        }

        @Override
        public void onNothingSelected(AdapterView<?> adapterView) {

        }
    });

Zuerst erstelle ich einen Listener und ordne ihn einem variablen Callback zu; Dann erstelle ich einen zweiten Listener anonym und wenn dieser zu einem ersten Mal aufgerufen wird, ändert sich der Listener =]


haha ... Ich habe die gleiche Frage. Wenn initViews () einfach so ist. Die Reihenfolge ist der Schlüssel, Listener ist der letzte. Viel Glück !

spinner.setAdapter(adapter);
spinner.setSelection(position);
spinner.setOnItemSelectedListener(listener);

spinner.setOnItemSelectedListener(this); // Will call onItemSelected() Listener.

Behandeln Sie das also zum ersten Mal mit einem Integer-Wert

Beispiel: Zuerst Take int check = 0;

public void onItemSelected(AdapterView<?> parent, View arg1, int pos,long id) {
   if(++check > 1) {
      TextView textView = (TextView) findViewById(R.id.textView1);
      String str = (String) parent.getItemAtPosition(pos);
      textView.setText(str);
   }
}

Sie können dies mit einem booleschen Wert tun und auch die aktuellen und vorherigen Positionen überprüfen. Siehe hier





android-spinner