Простой вопрос - один обработчик клика на несколько кнопок

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

Простой вопрос - один обработчик клика на несколько кнопок

Сообщение Foenix » 27 ноя 2012, 18:37

Есть несколько почти одинаковых кнопок в диалоге, нужно на них повесить один слушатель , различия в одной подставляемой строчке.
Как это сделать одной процедурой,а не несколькими? Только не используя switch и подобное.
R.id.team

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

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: Простой вопрос - один обработчик клика на несколько кноп

Сообщение rezak90 » 27 ноя 2012, 18:59

без свитча никак, и почему он вам не нравится? как вы будете различать какой айди обрабатывать? ифами что ли?
R.id.team
Политика на форуме запрещена

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

Re: Простой вопрос - один обработчик клика на несколько кноп

Сообщение Foenix » 27 ноя 2012, 19:06

Да мне все равно какой айди :)
По view буду узнавать какая кнопочка нажата. Мне всего лишь одно ее свойство надобно.
R.id.team

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

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: Простой вопрос - один обработчик клика на несколько кноп

Сообщение rezak90 » 27 ноя 2012, 20:22

всё равно костыльно как то... в свитче меняли бы свойство и всё... или вы думаете что долгий свитч это не красиво и не профессионально, я видел в приличном приложении свит на сотни строк... а что ж поделаешь если по другому никак.
R.id.team
Политика на форуме запрещена

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

Re: Простой вопрос - один обработчик клика на несколько кноп

Сообщение Foenix » 27 ноя 2012, 21:12

ну, представь, куча кнопок, обозначающих, к примеру, цвета. По нажатию на кнопку будет меняться цвет фона. И что, писать обработку каждой?
R.id.team

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

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: Простой вопрос - один обработчик клика на несколько кноп

Сообщение rezak90 » 27 ноя 2012, 21:17

а как вы идентифицируете нажатия кнопки А Б и В и т.д. ... конечно придётся писать для каждой, если они одной строкой даже отличаются
R.id.team
Политика на форуме запрещена

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

Re: Простой вопрос - один обработчик клика на несколько кноп

Сообщение Foenix » 27 ноя 2012, 23:00

стойте, подождите
в обработчик же передается view? А через него я могу любое свойство кнопки посмотреть - название,например, цвет ее поверхности или очень удобная штука - тэг. Вот в него я и напишу что мне нужно. Это ж простая строчка.
Впрочем, я уже сделала, повесив один обрабочик на каждую, но это не то. Я хочу и на каждую не вешать. Можно через свойство кнопки - онклик, но у меня проблема - эти кнопки в диалоге находятся, там активити нету, придется с бубном танцевать, а меня это пока не устраивает. Так проще.
Потом подумаю.
R.id.team

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

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: Простой вопрос - один обработчик клика на несколько кноп

Сообщение rezak90 » 27 ноя 2012, 23:38

ну пробуйте кастить вью и менять в ней свойство, но опять таки один оброботчик не выйдет на все кнопки
R.id.team
Политика на форуме запрещена

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

Re: Простой вопрос - один обработчик клика на несколько кноп

Сообщение Foenix » 28 ноя 2012, 00:30

да нет, обработчик onClick я УЖЕ написала один на все, все работает..
не получается просто его , как бы объяснить, одним оператором установить сразу на все.
Грубо говоря, мне хотелось бы заменить это

Код: Выделить всё

ImageButton btn0 = (ImageButton) v.findViewById(R.id.btn0);
ImageButton btn1 = (ImageButton) v.findViewById(R.id.btn1);
ImageButton btn2 = (ImageButton) v.findViewById(R.id.btn2);
***
btn0.setOnClickListener(this.onClick);
btn1.setOnClickListener(this.onClick);
btn2.setOnClickListener(this.onClick);
***
Каким-то ХОТЯ БЫ циклом.
R.id.team

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

Аватара пользователя
Finch
Сообщения: 439
Зарегистрирован: 16 июл 2012, 21:37

Re: Простой вопрос - один обработчик клика на несколько кноп

Сообщение Finch » 28 ноя 2012, 00:40

Olivka писал(а):да нет, обработчик onClick я УЖЕ написала один на все, все работает..
не получается просто его , как бы объяснить, одним оператором установить сразу на все.
Грубо говоря, мне хотелось бы заменить это

Код: Выделить всё

ImageButton btn0 = (ImageButton) v.findViewById(R.id.btn0);
ImageButton btn1 = (ImageButton) v.findViewById(R.id.btn1);
ImageButton btn2 = (ImageButton) v.findViewById(R.id.btn2);
***
btn0.setOnClickListener(this.onClick);
btn1.setOnClickListener(this.onClick);
btn2.setOnClickListener(this.onClick);
***
Каким-то ХОТЯ БЫ циклом.
http://habrahabr.ru/post/116945/
CEO of a company R.id.team

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: Простой вопрос - один обработчик клика на несколько кноп

Сообщение rezak90 » 28 ноя 2012, 01:09

не вижу смысла в использовании Guice:
1) на изучение нужно потратить время (не много но всё таки придётся, в итоги зачем?);
2) код уменьшится но увеличится время что бы понять код;
3) возможны вы и будете понимать код, а другой разработчик уже нет;
4) проект должен быть огромен что бы всё таки прибегать к таким действиям;
5) тоскание за собой дополнительной либы;

З.Ы. и на счёт быстродействия не вникал, но не думаю что с ней быстрее работать чем на прямую инициализировать объект.
R.id.team
Политика на форуме запрещена

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: Простой вопрос - один обработчик клика на несколько кноп

Сообщение rezak90 » 28 ноя 2012, 01:15

Olivka, раз уж так принципиально, то вот велосипед =)

Код: Выделить всё

private int[] color = {Color.Red, Color. Blue, Color.Yellow, Color.Green};
private Button[] btnAll = {R.id.btn1, R.id.btn2, R.id.btn3, R.id.btn4};
//....
public void onClick(View view) {
for(int i = 0; i < 4; i++) {
if(btnAll[i] == view.getId())
btnAll[i].setColorText(color[i]);
}
}
Редактор кода покорячил мой код, &#93 означает квадратные скобки.
З.Ы. только инициализируйте кнопки =)
R.id.team
Политика на форуме запрещена

AndreyI
Сообщения: 372
Зарегистрирован: 14 май 2012, 16:18

Re: Простой вопрос - один обработчик клика на несколько кноп

Сообщение AndreyI » 28 ноя 2012, 05:29

Olivka писал(а):да нет, обработчик onClick я УЖЕ написала один на все, все работает..
не получается просто его , как бы объяснить, одним оператором установить сразу на все.
Грубо говоря, мне хотелось бы заменить это

Код: Выделить всё

ImageButton btn0 = (ImageButton) v.findViewById(R.id.btn0);
ImageButton btn1 = (ImageButton) v.findViewById(R.id.btn1);
ImageButton btn2 = (ImageButton) v.findViewById(R.id.btn2);
***
btn0.setOnClickListener(this.onClick);
btn1.setOnClickListener(this.onClick);
btn2.setOnClickListener(this.onClick);
***
Каким-то ХОТЯ БЫ циклом.
Все layout-ы (контейнеры) в которые помещены кнопки наследуются от класса ViewGroup. У него есть методы с помощью которых можно получить доступ ко всем View находящихся внутри layuot по индексу, а значит можно организовать их перебор в цикле.

Код: Выделить всё

for (int i = 0; i < layout.getChildCount(); i++) {
	View v= layout.getChildAt(i);
	if (v instanceof ImageButton){
		((ImageButton)v).setOnClickListener(this);
	}	
}

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

Re: Простой вопрос - один обработчик клика на несколько кноп

Сообщение Foenix » 28 ноя 2012, 08:10

AndreyI, а если мне не все ImageButton нужно перебирать? Мне нужен какой-то признак, чтоб перебирать не все. А то у меня десяток таких, и парочка других, под которых свои обработчики.

rezak90, ну почему велосипед.. только я не пойму, это что - онклик к любому компоненту привяжется?
Я немного не то хотела, а как в примере выше - привязывать один онклик к разным кнопкам.
R.id.team

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

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: Простой вопрос - один обработчик клика на несколько кноп

Сообщение rezak90 » 28 ноя 2012, 08:54

rezak90, ну почему велосипед.. только я не пойму, это что - онклик к любому компоненту привяжется?
Я немного не то хотела, а как в примере выше - привязывать один онклик к разным кнопкам.

Код: Выделить всё

public MainActivity extends Activity implements OnClickListener{
//при инициализации
btn1.setOnClickListener(this);
btn2.setOnClickListener(this);
//и т.д.
public void onClick(View view) {
//вот вам один обработчик на все кнопки
}
}

Код: Выделить всё

private OnClickListener listener = new View.OnClickListener() {
public void onClick(View view) {
//вот вам второй вариант
}
}
//при инициализации
btn1.setOnClickListener(listener);
btn2.setOnClickListener(listener);
//и т.д.
R.id.team
Политика на форуме запрещена

brucemax
Сообщения: 117
Зарегистрирован: 01 апр 2012, 16:09
Откуда: Минск
Контактная информация:

Re: Простой вопрос - один обработчик клика на несколько кноп

Сообщение brucemax » 28 ноя 2012, 12:18

Olivka писал(а):да нет, обработчик onClick я УЖЕ написала один на все, все работает..
не получается просто его , как бы объяснить, одним оператором установить сразу на все.
Грубо говоря, мне хотелось бы заменить это

Код: Выделить всё

ImageButton btn0 = (ImageButton) v.findViewById(R.id.btn0);
ImageButton btn1 = (ImageButton) v.findViewById(R.id.btn1);
ImageButton btn2 = (ImageButton) v.findViewById(R.id.btn2);
***
btn0.setOnClickListener(this.onClick);
btn1.setOnClickListener(this.onClick);
btn2.setOnClickListener(this.onClick);
***
Каким-то ХОТЯ БЫ циклом.

Код: Выделить всё

private Resources mRes; // Ресурсы приложени
private String[] idOfButtons;   // заполняем айдишниками кнопок
...
...

for (int position = 0; position < idOfButtons.length(); position++) {
   Integer btnId = mRes.getIdentifier(idOfButtons[position], "id", mContext.getPackageName());
   ImageButton btn = (ImageButton) v.findViewById(btnId);
   btn.setOnClickListener(this.onClick);
}
Не?

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

Re: Простой вопрос - один обработчик клика на несколько кноп

Сообщение Foenix » 28 ноя 2012, 13:53

brucemax, вот на этой строчке
ImageButton btn = (ImageButton) v.findViewById(btnId);
выдает nullpoinerexception
в переменной btnId там 0 записался.
Разве функция findViewById(btnId); может по целым числам искать?

Если беру вторую кнопку, то тоже btnId у нее нолик.
ВОт текст.

Код: Выделить всё

Context mContext = getActivity().getBaseContext() ;		
		 mRes = mContext.getResources();		 
		String[] idOfButtons={"R.id.btn0","R.id.btn1", "R.id.btn2", "R.id.btn3", "R.id.btn4"};   
		for (int position = 0; position < idOfButtons.length; position++) {			
			   Integer btnId = mRes.getIdentifier(idOfButtons[position], "id", ( getActivity()).getBaseContext().getPackageName());			  
			   ImageButton btn = (ImageButton) v.findViewById(btnId);			  
			   btn.setOnClickListener(this.onClick);
			}
Контексты у меня такие, т.к. это у меня FragmentDialog
R.id.team

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

brucemax
Сообщения: 117
Зарегистрирован: 01 апр 2012, 16:09
Откуда: Минск
Контактная информация:

Re: Простой вопрос - один обработчик клика на несколько кноп

Сообщение brucemax » 28 ноя 2012, 14:45

Olivka писал(а):brucemax, вот на этой строчке
ImageButton btn = (ImageButton) v.findViewById(btnId);
выдает nullpoinerexception
в переменной btnId там 0 записался.
Всё верно, всё сходиться=) Извини, что до конца не разжевал. Просто функция не нашла такой ресурс, а всё потому, что ты массив неправильно заполнила.. R.id. убери.. То есть вот так будет:

Код: Выделить всё

 String[] idOfButtons={"btn0","btn1", "btn2", "btn3", "btn4"}; 

Разве функция findViewById(btnId); может по целым числам искать?
А по чём она по-твойму ищет?) Так айдишник это же и есть целое число.

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

Re: Простой вопрос - один обработчик клика на несколько кноп

Сообщение Foenix » 28 ноя 2012, 16:39

Ура, получилось!
Спасибо, что теперь разжевал и в рот положил :)
Супер теперь, мне нравится!
R.id.team

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

brucemax
Сообщения: 117
Зарегистрирован: 01 апр 2012, 16:09
Откуда: Минск
Контактная информация:

Re: Простой вопрос - один обработчик клика на несколько кноп

Сообщение brucemax » 28 ноя 2012, 17:09

Olivka писал(а):Ура, получилось!
Спасибо, что теперь разжевал и в рот положил :)
Супер теперь, мне нравится!
Я не меньше тебя рад, что тебе это помогло! Не думал, что моей квалификации уже хватает для подобной помощи)) Моя планка поднялась.. Отныне я не считаю себя чайником :) !

Ответить