Android Spinner: Получить выбранное событие изменения элемента

Как вы можете установить прослушиватель событий для счетчика при выборе выбранного элемента?

В основном то, что я пытаюсь сделать, это нечто похожее на это:

spinner1.onSelectionChange = handleSelectionChange;

void handleSelectionChange(Object sender){
    //handle event
}

Ответ 1

Некоторые из предыдущих ответов неверны. Они работают для других виджетов и видов, но в документации для Spinner widget четко указано:

Счетчик не поддерживает элемент click Мероприятия. Вызов этого метода повысит исключение.

Лучше использовать OnItemSelectedListener() вместо:

spinner.setOnItemSelectedListener(new OnItemSelectedListener() {
    @Override
    public void onItemSelected(AdapterView<?> parentView, View selectedItemView, int position, long id) {
        // your code here
    }

    @Override
    public void onNothingSelected(AdapterView<?> parentView) {
        // your code here
    }

});

Это работает для меня.

Обратите внимание, что метод onItemSelected также вызывается, когда создается представление, поэтому вы можете рассмотреть возможность его ввода внутри вызова метода onCreate().

Ответ 2

Spinner spnLocale = (Spinner)findViewById(R.id.spnLocale);

spnLocale.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
    public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) { 
        // Your code here
    } 

    public void onNothingSelected(AdapterView<?> adapterView) {
        return;
    } 
}); 

Примечание: Помните одно.

Событие Spinner OnItemSelectedListener будет выполняться дважды:

  • Инициализация Spinner
  • Пользователь выбран вручную

Попробуйте дифференцировать эти два с помощью переменной флага.

Ответ 3

В своей деятельности вы можете реализовать класс AdapterView.OnItemSelectedListener.

И затем используйте нижнюю строку в onCreate()

Spinner spin = (Spinner) findViewById(R.id.spinner);
spin.setOnItemSelectedListener(this);

Затем переопределите эти два метода:

public void onItemSelected(AdapterView<?> parent, View v, int position, long id) {
    selection.setText(items[position]);
}

public void onNothingSelected(AdapterView<?> parent) {
    selection.setText("");
}

Ответ 4

fooobar.com/questions/24550/...

Вы можете избежать вызова OnItemSelectedListener() с простой проверкой: сохранить текущий индекс выбора в целочисленной переменной и проверить внутри onItemSelected (..), прежде чем что-либо делать.

например:

Spinner spnLocale;

spnLocale = (Spinner)findViewById(R.id.spnLocale);

int iCurrentSelection = spnLocale.getSelectedItemPosition();

spnLocale.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
    public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) { 
    if (iCurrentSelection != i){
            // Your code here
    }
    iCurrentSelection = i;
    } 

    public void onNothingSelected(AdapterView<?> adapterView) {
        return;
    } 
}); 

Из-за того, что iCurrentSelection должен быть в области объекта, чтобы это работало!

Ответ 5

Найдите свое имя spinner и найдите id, затем реализуйте этот метод.

spinnername.setOnItemSelectedListener(new OnItemSelectedListener() {

    @Override
    public void onItemSelected(AdapterView<?> parentView, View selectedItemView, int position, long id) {
        // your code here
    }

    @Override
    public void onNothingSelected(AdapterView<?> parentView) {
        // your code here
    }
});

Ответ 6

Документы для спиннер-виджет говорит

Спиннер не поддерживает события щелчка предмета.

Вы должны использовать setOnItemSelectedListener для решения вашей проблемы.

Ответ 7

Не имеет значения, вы установите OnItemSelectedListener в onCreate или onStart - он все равно будет вызываться во время создания активности или запуска (соответственно).
Поэтому мы можем установить его в onCreate (и НЕ в onStart!).
Просто добавьте флаг для определения первой инициализации:

private Spinner mSpinner;
private boolean mSpinnerInitialized;

то в onCreate (или onCreateView) просто:

mSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
                if (!mSpinnerInitialized) {
                    mSpinnerInitialized = true;
                    return;
                }

                // do stuff
            }

            public void onNothingSelected(AdapterView<?> adapterView) {
                return;
            }
        });

Ответ 8

spinner1.setOnItemSelectedListener(
    new AdapterView.OnItemSelectedListener() {
        //add some code here
    }
);

Ответ 9

Если вам нужен true onChangedListener(). Сохраните начальное значение в обработчике и проверьте, не изменилось ли оно. Это просто и не требуется глобальная переменная. Работает, если на странице имеется более одного счетчика.

String initialValue = // get from Database or your object
mySpinner.setOnItemSelectedListener(new SpinnerSelectedListener(initialValue));

...

protected class SpinnerSelectedListener implements AdapterView.OnItemSelectedListener {

        private SpinnerSelectedListener() {
            super();
        }

        public SpinnerSelectedListener(String initialValue) {
            this();
            this.initialValue = initialValue;
        }

        private String initialValue;

        // getter and setter removed.  

        @Override
        public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
            final String newValue = (String) spinHeight.getItemAtPosition(position);
            if (newValue.equals(initialValue) == false) {
               // Add your code here.  The spinner has changed value. 

               // Maybe useful.   
               // initialValue = newValue;
            }

        }

        @Override
        public void onNothingSelected(AdapterView<?> parent) {
               // Maybe useful.   
               // initialValue = null; 
        }
    }

Объекты - ваш друг, используйте их.

Ответ 10

spinner.setOnItemSelectedListener(
            new AdapterView.OnItemSelectedListener() {

                @Override
                public void onItemSelected(AdapterView<?> arg0, View arg1,
                        int arg2, long arg3) {

                    // TODO Auto-generated method stub
                }

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

                }
                //add some code here
            }
        );

Ответ 11

возьмите глобальную переменную для текущего выбора счетчика:

int currentItem = 0;

spinner_counter = (Spinner)findViewById(R.id.spinner_counter);
String[] value={"20","40","60","80","100","All"};
aa=new ArrayAdapter<String>(this,R.layout.spinner_item_profile,value);
aa.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinner_counter.setAdapter(aa);

spinner_counter.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
        @Override
        public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
            if(currentItem == position){
                return; //do nothing
            }
            else
            {
                 TextView spinner_item_text = (TextView) view;
                 //write your code here
            }
            currentItem = position;
        }

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

        }
    });

//R.layout.spinner_item_profile
<?xml version="1.0" encoding="utf-8"?>

<TextView  android:id="@+id/spinner_item_text"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent" 
android:layout_height="wrap_content"
android:background="@drawable/border_close_profile"
android:gravity="start"  
android:textColor="@color/black"         
android:paddingLeft="5dip"
android:paddingStart="5dip"
android:paddingTop="12dip"
android:paddingBottom="12dip"
/>

//drawable/border_close_profile
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
  <item>
   <shape android:shape="rectangle">
    <solid android:color="#e2e3d7" />
   </shape>
 </item>
<item android:left="1dp"
android:right="1dp"
android:top="1dp"
android:bottom="1dp">
<shape android:shape="rectangle">
    <solid android:color="@color/white_text" />
</shape>
</item>
</layer-list>

Ответ 12

Блестящее выступление Стефана Кламппа также очень помогло мне. Спасибо. Я новичок, а "@Override" в нем вызвал ошибку "должен переопределить метод Super class с тем же именем". Eclipse предложил мне удалить переопределения. Когда я это сделал, это сработало. Пожалуйста, не спрашивайте меня, как и почему.

Ответ 13

Лучший способ, который я думаю, это иметь flagitemselected = 0; в onCreate(). И на выбранном элементе увеличивается значение этого флага, т. flagitemselected++; а затем проверьте

if(flagitemselected!=1)
{
// do your work here
}

Это поможет, я думаю.

Ответ 14

Это будет работать инициализировать спиннер и findviewbyid и использовать это будет работать

    Spinner schemeStatusSpinner;

  schemeStatusSpinner = (Spinner) dialog.findViewById(R.id.spinner);

schemeStatusSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
        @Override
        public void onItemSelected(AdapterView<?> parentView, View selectedItemView, int position, long id) {
            // your code here
            if(schemeStatusSpinner.getSelectedItemId()==4){
                reasonll.setVisibility(View.VISIBLE);
            }
            else {
                reasonll.setVisibility(View.GONE);
            }
        }

        @Override
        public void onNothingSelected(AdapterView<?> parentView) {
            // your code here
        }

    });

Ответ 15

Один трюк, который я нашел, заключался в том, что ваш setOnItemSelectedListeners был включен в onWindowFocusChanged вместо onCreate. Я пока не нашел никаких плохих побочных эффектов для этого. В принципе, настройте слушателей после того, как окно будет нарисовано. Я не уверен, как часто работает onWindowFocusChanged, но достаточно легко создать себе блокирующую переменную, если вы обнаружите, что она работает слишком часто.

Я думаю, что Android может использовать систему обработки сообщений, и если вы поместите ее все в onCreate, вы можете столкнуться с ситуациями, когда счетчик заполняется после того, как он нарисован. Таким образом, ваш слушатель погаснет после того, как вы установили местоположение элемента. Разумеется, это обоснованная догадка, но не стесняйтесь исправить меня по этому поводу.