Есть ли способ использовать setOnClickListener с Android Spinner?

Исключение java.lang.RuntimeException: «Не вызывайте setOnClickListener для AdapterView. Возможно, вместо этого вам нужен setOnItemClickListener», но это неверно. Я использую setOnItemClickListener, чтобы делать некоторые вещи на основе нового выбора, но мне также нужно сделать некоторые вещи, прежде чем пользователь изменит выбор. В частности, я собираю данные для каждого выбора, который необходимо сохранить в файл перед переходом к другому выбору, поскольку другой выбор связан с другим набором данных. Есть ли способ использовать setOnClickListener с Android 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
            ...

person jacknad    schedule 19.08.2010    source источник
comment
Новое (рабочее) решение доступно здесь: stackoverflow.com/a/8520801/406090   -  person OferR    schedule 15.12.2011


Ответы (2)


Вам нужно будет установить прослушиватель кликов в базовом представлении (обычно это TextView с идентификатором: android.R.id.text1) счетчика. Для этого:

  • Создайте собственный счетчик
  • В конструкторе (с атрибутами) создайте счетчик, указав макет android.R.layout.simple_spinner_item.
  • Сделайте findViewById(android.R.id.text1), чтобы получить TextView
  • Теперь установите onClickListener в TextView
person Sameer Segal    schedule 19.08.2010
comment
так что onclicklistener будет определен внутри пользовательского счетчика? Должен ли я также определить onclicklistener для самого счетчика в действии? - person Namratha; 16.04.2013
comment
Я попробовал предложенный вами подход - щелчок зарегистрирован, но выпадающий список все еще работает. Как предотвратить работу раскрывающегося списка, так как при нажатии на счетчик я перехожу на другой экран. - person Namratha; 16.04.2013
comment
Я сделал это с Android: clickable = false - person Namratha; 16.04.2013

Вы можете реплицировать событие onclick, используя события ontouch.

    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;
        }
    });
person dcart1234    schedule 17.08.2013
comment
почему вы назвали spinner.setClickable(false)? - person programmer; 10.09.2017
comment
я тоже не понимаю. - person gumuruh; 20.05.2020