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

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

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

Двойной вызов OnItemSelected для spinner - Android

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

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

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

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

Android Кастомный ArrayAdapter для Spinner
Spinner Android
Spinner элементы Android
Android Spinner
Spinner Android

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

Или воспользуйтесь поиском по форуму:
patriot2008
70 / 70 / 4
Регистрация: 04.12.2008
Сообщений: 463
15.12.2012, 17:11     Двойной вызов OnItemSelected для spinner #9
Rubanov, все верно. при повороте сначала спиннер просто инициализируется, а потом устанавливается выбранное значение. во время инициализации устанавливается 1-ый элемент спиннера, как выбранный. потом внутри происходит проверка, если выбранный элемент не совпадает с инициализированным, то устанавливаем необходимый.
надеюсь, доступно обьяснил )))
Yandex
Объявления
15.12.2012, 17:11     Двойной вызов OnItemSelected для spinner
Ответ Создать тему
Опции темы

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