2013-01-06 12 views
7

Pracuję nad zintegrowaniem selektora liczb z moją aplikacją. Aktywność wyświetla listę przedmiotów, każdy z selektorem liczb. Użytkownik może zwiększyć lub zmniejszyć ilość za pomocą selektora liczb. Czyniąc to, chciałbym zaktualizować TextView pokazujący cenę.Dodawanie odbiornika do widgetu selektora liczb

Wpadłem w trudność, próbując to osiągnąć. Zrobiłem prosty projekt i próbowałem wyświetlić komunikat z tostem, gdy użytkownik kliknął widżet, ale bez skutku.

Zgaduję, że widżet liczbowy nie jest traktowany jak przycisk, ponieważ odbiornik kliknięć nie działa? Byłbym wdzięczny za wszelkie porady dotyczące dodawania słuchacza.

Poniżej jest mój kod:

NumberPicker np; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    np = (NumberPicker)findViewById(R.id.numberPicker1); 
    np.setMaxValue(99); 
    np.setMinValue(0); 
    np.setValue(50); 

    np.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      Toast.makeText(v.getContext(), "Number selected", Toast.LENGTH_SHORT).show(); 
     } 
    }); 
} 
+2

Być może trzeba zrobić 'np.setClickable (true)' jeśli tylko chcesz to kliknij wydarzenia. Jeśli jednak chcesz posłuchać zmiany numeru, możesz skorzystać z [OnValueChangeListener] (http://developer.android.com/reference/android/widget/NumberPicker.OnValueChangeListener.html)? –

Odpowiedz

14

Do set listenener z Picker, twoja aktywność musi zaimplementować moduł nasłuchujący interfejsu pobierania. (Faktycznie, Twoja aktywność nie jest obowiązkowe, aby zaimplementować interfejs, można również użyć anonimowego metodę wewnętrzną Cokolwiek działa.).

Więc w swojej działalności:

public class MainActivity extends Activity implements NumberPicker.OnValueChangeListener { 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     NumberPicker np = (NumberPicker)findViewById(R.id.numberPicker1); 
     np.setMaxValue(99); 
     np.setMinValue(0); 
     np.setValue(50); 
     np.setOnValueChangedListener(this); 

    } 

    public void onValueChange(NumberPicker picker, int oldVal, int newVal) { 
     Toast.makeText(this, "change", Toast.LENGTH_SHORT).show(); 
    } 
} 
+0

Spot na! Bardzo jasna i dobrze wyjaśniona odpowiedź, dziękuję! – Javacadabra

+0

Twoje powitanie :) – Zyoo

+0

Czy to nie działa z fragmentem? – timberlake

9

Dla nowszych programistów Androida (jak ja) , sama czynność nie jest wymagana do implementacji odbiornika przez. To musi być przekazane do setOnValueChangedListener().

Pozwala to uniknąć zbyt dużej liczby implements i zbyt wielu zachodzących na siebie @Overrides.

Przykład:

// Number Picker 
NumberPicker np = (NumberPicker) getView().findViewById(R.id.numberPicker1); 
np.setMinValue(0); 
np.setMaxValue(35); 

np.setOnValueChangedListener(new NumberPicker.OnValueChangeListener() { 
    @Override 
    public void onValueChange(NumberPicker numberPicker, int i, int i2) { 

     Toast.makeText(this, "Value was: " + Integer.toString(i) + " is now: " + Integer.toString(i2), Toast.LENGTH_SHORT).show(); 

    } 
}); 
+0

Działa ... dziękuję;) – deanpodgornik