Настройка spinner onClickListener () в Android

Я пытаюсь запустить onClickListener на Spinner, но я получаю следующую ошибку:

Java.lang.RuntimeException: «Не вызывайте setOnClickListener для AdapterView. Вероятно, вы хотите установить setOnItemClickListener,

Я уверен, что хочу вызвать onClickListener и NOT onItemClickListener. Я нашел вопрос, заданный кем-то еще в Stack Overflow, есть ли способ использовать setOnClickListener с Android Spinner?

В ответе говорится:

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

Создание настраиваемого Spinner В конструкторе (с атрибутами) создайте spinner, предоставив макет android.R.layout.simple_spinner_item. Сделайте findViewById (android.R.id.text1), чтобы получить TextView Теперь установите onClickListener в TextView

Я пробовал ответить там, но, похоже, это не работает. Я получаю нулевой указатель на TextView после того, как я нахожу findViewById ().

Это то, что я делаю:

Spinner spinner = (Spinner) findViewById(R.id.spinner); ArrayAdapter adapter = new ArrayAdapter(this,R.layout.layoutspinner,dataArray); spinner.setAdapter(adapter); TextView SpinnerText = (TextView)findViewById(R.id.spinnerText); if (SpinnerText == null) { System.out.println("Not found"); } else { SpinnerText.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View arg0) { //Do something } }); } 

Файл layoutspinner.xml

   

Что я делаю не так?

Я новичок в Stack Overflow, я не нашел способ опубликовать дополнительный вопрос в другой теме (или комментарий, так как мне нужно немного переделать), поэтому я начал новый вопрос.

По рекомендации я пробовал:

 int a = spinnerMes.getCount(); int b = spinnerMes.getChildCount(); System.out.println("Count = " + a); System.out.println("ChildCount = " + b); for (int i = 0; i < b; i++) { View v = spinnerMes.getChildAt(i); if (v == null) { System.out.println("View not found"); } else { v.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //Click code } }); } } 

Но LogCat не дает многообещающих результатов.

 10-14 16:09:08.127: INFO/System.out(3116): Count = 7 10-14 16:09:08.127: INFO/System.out(3116): ChildCount = 0 

Я тестировал это на уровнях 7 и 8 API с теми же результатами.

Следующее работает так, как вы этого хотите, но это не идеально.

 public class Tester extends Activity { String[] vals = { "here", "are", "some", "values" }; Spinner spinner; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); spinner = (Spinner) findViewById(R.id.spin); ArrayAdapter ad = new ArrayAdapter(this, android.R.layout.simple_dropdown_item_1line, vals); spinner.setAdapter(ad); Log.i("", "" + spinner.getChildCount()); Timer t = new Timer(); t.schedule(new TimerTask() { @Override public void run() { int a = spinner.getCount(); int b = spinner.getChildCount(); System.out.println("Count =" + a); System.out.println("ChildCount =" + b); for (int i = 0; i < b; i++) { View v = spinner.getChildAt(i); if (v == null) { System.out.println("View not found"); } else { v.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Log.i("","click"); } }); } } } }, 500); } } 

Позвольте мне точно знать, как вам нужен счетчик, чтобы вести себя, и мы можем разработать лучшее решение.

Вот рабочее решение:

Вместо установки OnClickListener Spinner мы устанавливаем OnTouchListener и OnKeyListener.

 spinner.setOnTouchListener(Spinner_OnTouch); spinner.setOnKeyListener(Spinner_OnKey); 

и слушателей:

 private View.OnTouchListener Spinner_OnTouch = new View.OnTouchListener() { public boolean onTouch(View v, MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_UP) { doWhatYouWantHere(); } return true; } }; private static View.OnKeyListener Spinner_OnKey = new View.OnKeyListener() { public boolean onKey(View v, int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_DPAD_CENTER) { doWhatYouWantHere(); return true; } else { return false; } } }; 

Всякий раз, когда вам нужно выполнить некоторые действия при нажатии Spinner в Android, используйте следующий метод.

 mspUserState.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_UP) { doWhatIsRequired(); } return false; } }); 

Одна вещь, о которой нужно помнить, – всегда возвращать False при использовании вышеуказанного метода. Если вы вернете True, выпадающие элементы счетчика не будут отображаться при нажатии на Spinner.

Лично я использую это:

  final Spinner spinner = (Spinner) (view.findViewById(R.id.userList)); spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { @Override public void onItemSelected(AdapterView parent, View view, int position, long id) { userSelectedIndex = position; } @Override public void onNothingSelected(AdapterView parent) { } }); 

Прежде всего, spinner не поддерживает события щелчка элемента. Вызов этого метода вызовет исключение.

Вы можете использовать setOnItemSelectedListener:

 Spinner s1; s1 = (Spinner)findViewById(R.id.s1); int selectionCurrent = s1.getSelectedItemPosition(); spinner.setOnItemSelectedListener(new OnItemSelectedListener() { @Override public void onItemSelected(AdapterView parentView, View selectedItemView, int position, long id) { if (selectionCurrent != position){ // Your code here } selectionCurrent= position; } } @Override public void onNothingSelected(AdapterView parentView) { // Your code here } }); 

Я предлагаю, чтобы все события для Spinner были разделены на два типа:

  1. Пользовательские события (вы имели в виду событие «щелчок»).

  2. Программные события.

Я также предлагаю, чтобы, когда вы хотите поймать пользовательское событие, вы просто хотите избавиться от «программных событий». Так что это довольно просто:

 private void setSelectionWithoutDispatch(Spinner spinner, int position) { AdapterView.OnItemSelectedListener onItemSelectedListener = spinner.getOnItemSelectedListener(); spinner.setOnItemSelectedListener(null); spinner.setSelection(position, false); spinner.setOnItemSelectedListener(onItemSelectedListener); } 

Есть ключевой момент: вам нужно setSelection (position, false). Параметр «false» в анимации немедленно активирует событие. Поведение по умолчанию заключается в том, чтобы вывести событие в очередь событий.

  • Как сортировать в алфавитном порядке, игнорируя регистр?
  • Android Не удалось создать экземпляр активности: не нашел class на пути
  • Портрет для телефона, альбом для планшета (Android-макет)
  • Зачем использовать Enums вместо констант?
  • Упреждающий базовый аут с HttpUrlConnection?
  • Разница между JSONObject и JSONArray
  • Запретить отображение клавиатуры при запуске
  • Java: Локальная переменная mi, определенная в охватывающей области, должна быть окончательной или эффективно конечной
  • Различия в виджетах для Android
  • Получение classа по его названию
  • Максимальный предел примитивного типа Java Long
  • Давайте будем гением компьютера.