Intereting Posts
Выявление фрагмента в действии для Android ViewManager Android Google Map – маркер Clicked открывает новую активность или большее окно Параметры для взаимодействия с клиентским сервером на Android Как установить и использовать coub db в android Google map v2 Пользовательская информация с двумя кнопками мыши или ImageView Как отображать таймер обратного отсчета в строке состояния в android, например, отображение времени? Тема Google Maps для Android Android :: Установить максимальную длину EditText программно с помощью другого InputFilter Использование намерения использовать камеру на Android Как добавить пользовательскую анимацию в маркер V3 на карте Google, когда я бросаю каждый маркер по одному? PANIC: Не удается найти путь к системе AVD. Пожалуйста, определите ANDROID_SDK_ROOT WebRTC на Android Когда я запускаю свой код UIAutomator для Android, он показывает ошибку Какой путь к файловой системе используется в Context.openFileOutput () Android? Эспрессо замерзает при просмотре с анимацией цикла

Настройка 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 В конструкторе (с атрибутами) создайте счетчик, предоставив макет android.R.layout.simple_spinner_item. Сделайте findViewById (android.R.id.text1), чтобы получить TextView Теперь установите onClickListener в TextView

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

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

Spinner spinner = (Spinner) findViewById(R.id.spinner); ArrayAdapter<String> adapter = new ArrayAdapter<String>(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

 <?xml version="1.0" encoding="utf-8"?> <TextView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/spinnerText" android:singleLine ="true" android:layout_width="fill_parent" android:layout_height="wrap_content" android:textSize="6pt" android:gravity="right"/> 

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

Я новичок в 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 с теми же результатами.

Solutions Collecting From Web of "Настройка spinner onClickListener () в Android"

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

 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<String> ad = new ArrayAdapter<String>(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); } } 

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

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

Вместо установки 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) { } }); 

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

Вы можете использовать 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» в анимации немедленно запускает событие. Поведение по умолчанию заключается в том, чтобы вывести событие в очередь событий.