2010-08-19 16 views
7

Wyjątek java.lang.RuntimeException to "Nie wywołuj metody setOnClickListener dla elementu AdapterView. Prawdopodobnie potrzebujesz zamiast tego metody setOnItemClickListener", ale to nie jest poprawne. Używam setOnItemClickListener do robienia pewnych rzeczy na podstawie nowego wyboru, ale muszę też zrobić kilka rzeczy, zanim użytkownik zmieni zaznaczenie. W szczególności zbieram dane dla każdej selekcji, która musi zostać zapisana w pliku przed przejściem do innej selekcji, ponieważ inna selekcja jest powiązana z innym zestawem danych. Czy istnieje sposób użycia setOnClickListener z Spinner Androida?Czy istnieje sposób użycia setOnClickListener z Androidem Spinner?

spinner.setOnClickListener(new View.OnClickListener() { 
    public void onClick(View v) { 
     // Do some stuff before the user changes the selection 
     ... 

spinner.setOnItemSelectedListener(new OnItemSelectedListener() { 
    @Override 
    public void onItemSelected(AdapterView<?> parent, 
      View view, int pos, long id) { 
      // Do some stuff based onItemSelected 
      ... 
+2

Nowe (działające) rozwiązanie jest dostępne tutaj: http://stackoverflow.com/a/8520801/406090 – OferR

Odpowiedz

5

Będziesz musiał ustawić Kliknij słuchacza na widoku bazowego (zazwyczaj TextView z ID: android.R.id.text1) przędzarki. Aby to zrobić:

  • Tworzenie niestandardowego Spinner
  • w konstruktorze (z atrybutami) stworzenie tarczy dostarczając układ android.R.layout.simple_spinner_item
  • zrobić findViewById (android.R.id .text1), aby uzyskać TextView
  • teraz ustaw onClickListener do TextView
+0

, więc onclicklistener będzie zdefiniowany wewnątrz niestandardowej tarczy? Czy powinienem również zdefiniować onclicklistener na samym spinerze w działaniu? – Namratha

+0

Próbowałem podejście sugerowane przez Ciebie - kliknięcie jest zarejestrowane, ale rozwijanie nadal działa. Jak zapobiec rozwijaniu się menu rozwijanego, ponieważ po kliknięciu pokrętła przechodzę do innego ekranu. – Namratha

+0

Zrobiłem to z Androidem: clickable = "false" – Namratha

7

można replikować zdarzenie onclick korzystając ontouch wydarzenia

this.spinner=(Spinner)findViewById(R.id.spinner); 
    this.spinner.setClickable(false); 
    this.spinner.setOnTouchListener(new View.OnTouchListener() { 

     @Override 
     public boolean onTouch(View v, MotionEvent event) { 
      Log.v(TAG, "spinner touch"); 

      //replicating a click 
      if(event.getAction() == MotionEvent.ACTION_UP){ 
       v.playSoundEffect(android.view.SoundEffectConstants.CLICK); 
      } 
      return true; 
     } 
    }); 
+0

+1 dla nowego ideału – kemdo

+1

@ dcart1234 Musisz zwrócić false, inaczej spinner nie otworzy się wyskakując .. – Praveen

+0

dlaczego wywołałeś spinner.setClickable (false)? – programmer

Powiązane problemy