Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

Программирование Android

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 5.00
Rubanov
5 / 5 / 0
Регистрация: 29.08.2010
Сообщений: 51
#1

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

11.12.2012, 00:25. Просмотров 1288. Ответов 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) {
        
    }
    
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.12.2012, 00:25
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Двойной вызов OnItemSelected для spinner (Программирование Android):

Spinner performClick выполняет OnItemSelected - Программирование Android
Здравствуйте! Мне необходимо программно открыть Spinner, но при этом не выполнить OnItemSelected... Т. е. нужно только открыть, не...

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

Как работает setOnItemSelectedListener для Spinner? - Программирование Android
Доброго дня. есть у меня Spinner: String data = {&quot;sdfsdfs.by&quot;, &quot;adfaf.ru&quot;, &quot;afafafafaf.uk&quot;, &quot;afasa.ua&quot;, &quot;goof.net&quot;}; ...

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

spinner - Программирование Android
как реализовать spinner чтобы к выбранной строке соответствовала число. например есть формула A+B+C=Z. A,B - это EditText (с этим все...

Spinner - Программирование Android
кто знает как сделать так чтобы при выборе пункта из Spinner выполнялся отдельный кусок кода? в моем случае есть код для генерации...

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

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

жаль нет сейчас возможности проверить как все это происходит...
вы у себя проверяли все это или просто догадки?
0
patriot2008
72 / 72 / 4
Регистрация: 04.12.2008
Сообщений: 463
14.12.2012, 00:04 #6
проверял, создал тестовый проект, запустил, посмотрел все в отладчике. На этом предыдущий пост и основывался
0
Rubanov
5 / 5 / 0
Регистрация: 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
1159 / 983 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
15.12.2012, 00:39 #8
интересно.
0
patriot2008
72 / 72 / 4
Регистрация: 04.12.2008
Сообщений: 463
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 - Программирование Android
В ответе выдает 0, что исправить? import android.os.Bundle; import android.app.Activity; import android.view.View; import...

Spinner - Программирование Android
подскажите пожалуйста есть такой код... spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { ...

быстрый Spinner - Программирование Android
Подскажите пожалуйста как реализовать. Имеется два спинера, сначала выбирается один, затем другой, нажимается кнопка &quot;сравнить&quot; и в...

spinner в ListView - Программирование Android
в каждой строке ListView есть текст и спинер указывающий какое то значение. два дня сижу не могу заставить чтоб каждый елемент листа...


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

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

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