Страница 1 из 1

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

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

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

Добавлено: 05 янв 2015, 11:16
Foenix
сто раз обсуждали. Ищи по словам "перебор элементов" или как-то так. Обработчик один присваивается всем кнопкам сразу, потом внутри используется свойство tag кнопки, например

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

Добавлено: 06 янв 2015, 01:18
doter.ua
Кастомный адаптер в помощь.

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

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

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

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

Добавлено: 07 янв 2015, 00:59
Foenix
нет, не отобранные по свойству tag, а по типу объекта "кнопка"

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

Добавлено: 08 янв 2015, 16:51
Upcoming
Спасибо отписавшимся. Вот какой в итоге велосипед получился:
[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