Форум программистов, компьютерный форум, киберфорум
Наши страницы
Программирование Android
Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 5.00
Rubanov
5 / 5 / 2
Регистрация: 29.08.2010
Сообщений: 51
#1

Двойной вызов OnItemSelected для spinner - Программирование Android

11.12.2012, 00:25. Просмотров 1394. Ответов 8
Метки нет (Все метки)

Добрый вечер! Прошу помочь. В main_activity у меня всего лишь один spinner (+id/spinner1). При смене ориентации экрана вызывается OnItemSelected один раз, если в этот момент выбрано A (в логах строка "Selected A" и два раза, если что-то другое (две одинаковые строки в логах). Почему этот метод срабатывает два раза?
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
package com.example.test;
 
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
import android.widget.Toast;
 
public class MainActivity extends Activity implements OnItemSelectedListener {
 
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Spinner spinner=(Spinner) findViewById(R.id.spinner1);
        ArrayAdapter<CharSequence> adapter = new ArrayAdapter<CharSequence>(this,
                android.R.layout.simple_spinner_item);
        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        adapter.add("A");   
        adapter.add("B");
        adapter.add("C");
        spinner.setAdapter(adapter);
        spinner.setOnItemSelectedListener(this);
    }
 
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }
 
    @Override
    public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2,
            long arg3) {
        Log.d("test", "Selected "+(char)('A'+arg2));
        Toast.makeText(this, "Selected "+(char)('A'+arg2), Toast.LENGTH_SHORT).show();
    }
 
    @Override
    public void onNothingSelected(AdapterView<?> arg0) {
        
    }
    
}

http://www.cyberforum.ru/android-dev/thread1236783.html
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.12.2012, 00:25
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Двойной вызов OnItemSelected для spinner (Программирование Android):

Кастомный ArrayAdapter для Spinner
Создал свой адаптер. Привязал его к списку Spinner. Получил идентификатор...

Как работает setOnItemSelectedListener для Spinner?
Доброго дня. есть у меня Spinner: String data = {&quot;sdfsdfs.by&quot;,...

Spinner
В ответе выдает 0, что исправить? import android.os.Bundle; import...

Spinner
кто знает как сделать так чтобы при выборе пункта из Spinner выполнялся...

Spinner
подскажите пожалуйста есть такой код... ...

8
patriot2008
72 / 72 / 10
Регистрация: 04.12.2008
Сообщений: 460
12.12.2012, 13:07 #2
android:configChanges="keyboardHidden|orientation"
добавьте эту строку в манифест файл к вашему активити. это будет значить, что смену ориентации вы обрабатываете сами. потому что сейчас андроид на смену ориентации пересоздает ваше активити.
0
V0v1k
1160 / 984 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
12.12.2012, 22:48 #3
patriot2008, и каким образом пересоздание активити приводит к вызову onItemSelected, тем более 2 раза?
0
patriot2008
72 / 72 / 10
Регистрация: 04.12.2008
Сообщений: 460
13.12.2012, 01:28 #4
V0v1k, если выбран первый элемент, про при создании Spinner вызовется метод onItemSelected. Если же выбран другой элемент (не первый), то при смене ориентации мы снова входим в onCreate. В первом onItemSelected идет срабатывания того, что элемент установлен (но arg1 равен null). Здесь просто инициализируется спиннер первым значением. Второй раз заходим в onItemSelected, там arg1 уже будет типа TextView со значением выбранного элемента (напр. В или С).
Таким образом, когда мы первый раз вошли в метод onItemSelected, то просто инициализировали спиннер, где первое значение будет установлено как выбранное. если же оно совпадает действительно с выбранным (выбрано А), то второй раз уже не войдет, т.к. незачем.
0
V0v1k
1160 / 984 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
13.12.2012, 03:59 #5
Цитата Сообщение от patriot2008 Посмотреть сообщение
если выбран первый элемент, про при создании Spinner вызовется метод onItemSelected.
на момент setOnItemSelectedListener спинер уже создан.

Цитата Сообщение от patriot2008 Посмотреть сообщение
В первом onItemSelected идет срабатывания того, что элемент установлен (но arg1 равен null)
проверяли? сильно сомнительно что туда вообще может прийти нул. да и написано, что в логах одинаковые строки.

жаль нет сейчас возможности проверить как все это происходит...
вы у себя проверяли все это или просто догадки?
0
patriot2008
72 / 72 / 10
Регистрация: 04.12.2008
Сообщений: 460
14.12.2012, 00:04 #6
проверял, создал тестовый проект, запустил, посмотрел все в отладчике. На этом предыдущий пост и основывался
0
Rubanov
5 / 5 / 2
Регистрация: 29.08.2010
Сообщений: 51
14.12.2012, 18:36  [ТС] #7
Цитата Сообщение от patriot2008 Посмотреть сообщение
V0v1k, если выбран первый элемент, про при создании Spinner вызовется метод onItemSelected. Если же выбран другой элемент (не первый), то при смене ориентации мы снова входим в onCreate. В первом onItemSelected идет срабатывания того, что элемент установлен (но arg1 равен null). Здесь просто инициализируется спиннер первым значением. Второй раз заходим в onItemSelected, там arg1 уже будет типа TextView со значением выбранного элемента (напр. В или С).
Таким образом, когда мы первый раз вошли в метод onItemSelected, то просто инициализировали спиннер, где первое значение будет установлено как выбранное. если же оно совпадает действительно с выбранным (выбрано А), то второй раз уже не войдет, т.к. незачем.
Всё верно, при первом вызове после поворота (но не после запуска) в arg1 находится null, при втором - уже нужный View. Но в arg2 - всегда номер выбранного элемента.
0
V0v1k
1160 / 984 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
15.12.2012, 00:39 #8
интересно.
0
patriot2008
72 / 72 / 10
Регистрация: 04.12.2008
Сообщений: 460
15.12.2012, 17:11 #9
Rubanov, все верно. при повороте сначала спиннер просто инициализируется, а потом устанавливается выбранное значение. во время инициализации устанавливается 1-ый элемент спиннера, как выбранный. потом внутри происходит проверка, если выбранный элемент не совпадает с инициализированным, то устанавливаем необходимый.
надеюсь, доступно обьяснил )))
0
15.12.2012, 17:11
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.12.2012, 17:11
Привет! Вот еще темы с решениями:

spinner
как реализовать spinner чтобы к выбранной строке соответствовала число....

Spinner
Доброго времени суток! Можно ли сделать так чтобы при выборе одного из...

Список из Spinner
Здравствуйте. Умею работать с Spinner, умею просто с ListView, но умею это...

элемент spinner
Подскажите, пожалуйста, как поставить текст элементов по центру? Код:...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru