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

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

Добавлено: 27 ноя 2012, 18:37
Foenix
Есть несколько почти одинаковых кнопок в диалоге, нужно на них повесить один слушатель , различия в одной подставляемой строчке.
Как это сделать одной процедурой,а не несколькими? Только не используя switch и подобное.

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

Добавлено: 27 ноя 2012, 18:59
rezak90
без свитча никак, и почему он вам не нравится? как вы будете различать какой айди обрабатывать? ифами что ли?

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

Добавлено: 27 ноя 2012, 19:06
Foenix
Да мне все равно какой айди :)
По view буду узнавать какая кнопочка нажата. Мне всего лишь одно ее свойство надобно.

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

Добавлено: 27 ноя 2012, 20:22
rezak90
всё равно костыльно как то... в свитче меняли бы свойство и всё... или вы думаете что долгий свитч это не красиво и не профессионально, я видел в приличном приложении свит на сотни строк... а что ж поделаешь если по другому никак.

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

Добавлено: 27 ноя 2012, 21:12
Foenix
ну, представь, куча кнопок, обозначающих, к примеру, цвета. По нажатию на кнопку будет меняться цвет фона. И что, писать обработку каждой?

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

Добавлено: 27 ноя 2012, 21:17
rezak90
а как вы идентифицируете нажатия кнопки А Б и В и т.д. ... конечно придётся писать для каждой, если они одной строкой даже отличаются

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

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

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

Добавлено: 27 ноя 2012, 23:38
rezak90
ну пробуйте кастить вью и менять в ней свойство, но опять таки один оброботчик не выйдет на все кнопки

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

Добавлено: 28 ноя 2012, 00:30
Foenix
да нет, обработчик 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);
***
Каким-то ХОТЯ БЫ циклом.

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

Добавлено: 28 ноя 2012, 00:40
Finch
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/

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

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

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

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

Добавлено: 28 ноя 2012, 01:15
rezak90
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 означает квадратные скобки.
З.Ы. только инициализируйте кнопки =)

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

Добавлено: 28 ноя 2012, 05:29
AndreyI
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);
	}	
}

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

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

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

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

Добавлено: 28 ноя 2012, 08:54
rezak90
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);
//и т.д.

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

Добавлено: 28 ноя 2012, 12:18
brucemax
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);
}
Не?

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

Добавлено: 28 ноя 2012, 13:53
Foenix
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

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

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

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

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

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

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

Добавлено: 28 ноя 2012, 16:39
Foenix
Ура, получилось!
Спасибо, что теперь разжевал и в рот положил :)
Супер теперь, мне нравится!

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

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