Установка обработчиков на множество элементов-детей

Ответить
Upcoming
Сообщения: 5
Зарегистрирован: 05 янв 2015, 00:50

Установка обработчиков на множество элементов-детей

Сообщение Upcoming » 05 янв 2015, 01:07

Возьмем, к примеру, таблицу TableLayout и заполним ее строки кнопками Button. Цель - отлавливать клики на кнопках. С методом onClick проблем нет: по id определяем, какая кнопка была кликнута, и выполняем определенные действия. Вопрос в другом: как, не назначая обработчик setOnClickListener на каждую кнопку, можно сделать это еще? Ведь этих самых кнопок в нашей таблице может быть сколько угодно, или же они вообще создаются динамически.

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: Установка обработчиков на множество элементов-детей

Сообщение Foenix » 05 янв 2015, 11:16

сто раз обсуждали. Ищи по словам "перебор элементов" или как-то так. Обработчик один присваивается всем кнопкам сразу, потом внутри используется свойство tag кнопки, например
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

Аватара пользователя
doter.ua
Сообщения: 1106
Зарегистрирован: 23 ноя 2013, 16:08
Откуда: Ukraine

Re: Установка обработчиков на множество элементов-детей

Сообщение doter.ua » 06 янв 2015, 01:18

Кастомный адаптер в помощь.
Семь раз отмерь - поставь студию.
Эклипс не студия, ошибка вылетит - не исправишь.
Скажи мне кто твой друг, и оба поставили студию.
Студия - свет, а эклипс - тьма.

Upcoming
Сообщения: 5
Зарегистрирован: 05 янв 2015, 00:50

Re: Установка обработчиков на множество элементов-детей

Сообщение Upcoming » 06 янв 2015, 22:25

Foenix, загоняем элементы, отобранные по свойству tag, в массив и в цикле присваиваем обработчик каждому, я правильно понял?

doter.ua, это адаптер, который изучается в 47 уроке (http://startandroid.ru/ru/uroki/vse-uro ... terov.html), да? Я просто пока до 36 дошел.

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: Установка обработчиков на множество элементов-детей

Сообщение Foenix » 07 янв 2015, 00:59

нет, не отобранные по свойству tag, а по типу объекта "кнопка"
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

Upcoming
Сообщения: 5
Зарегистрирован: 05 янв 2015, 00:50

Re: Установка обработчиков на множество элементов-детей

Сообщение Upcoming » 08 янв 2015, 16:51

Спасибо отписавшимся. Вот какой в итоге велосипед получился:
[syntax=java]
public class MainActivity extends Activity implements OnClickListener {

protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

setOnClickListeners(findViewById(R.id.table1), Button.class);
}

public void onClick(View v) {
// some code
}

public void setOnClickListeners(View parent, Class<? extends View> targetClass) {
if (parent instanceof ViewGroup) {
ViewGroup vg = (ViewGroup) parent;
for (int i = 0; i < vg.getChildCount(); i++) {
View child = vg.getChildAt(i);
setOnClickListeners(child, targetClass);
}
} else if (targetClass.isInstance(parent)) {
parent.setOnClickListener(this);
}
}
}
[/syntax]
Вдруг кому пригодится. А, может, кто-нибудь и в голову пару раз пнет за такой код. :D

Ответить