Как обработать press у батона?

Ответить
key4
Сообщения: 7
Зарегистрирован: 14 сен 2012, 14:58

Как обработать press у батона?

Сообщение key4 » 29 ноя 2012, 14:15

Привет всем. Подскажите как поймать press у кнопки.
Задача: нажал кнопку-пока держим-данные меняются и отбражаются-отпустил.
пробую вот так

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

public void onClick(View v){
    	switch(v.getId()){
    	case R.id.bDurationPlus:{
    		if(bDP.isPressed()) {
    		int m=Integer.parseInt(editDuration.getText().toString());
    		m++;
	    	editDuration.setText(String.valueOf(m));
}
	    	//break;
    	}
Не пашет, подскажите пожалуйста...

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

Re: Как обработать press у батона?

Сообщение Foenix » 29 ноя 2012, 20:31

не знаю точно, но где-то в редакторе xml видела такую настройку - allow long press (разрешить долгое нажатие) - может поможет чем..
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: Как обработать press у батона?

Сообщение rezak90 » 29 ноя 2012, 21:52

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

case btn1:
do{
//ваши действия
}while(btn1.isPressed())
R.id.team
Политика на форуме запрещена

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

Re: Как обработать press у батона?

Сообщение AndreyI » 30 ноя 2012, 05:49

rezak90 писал(а):

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

case btn1:
do{
//ваши действия
}while(btn1.isPressed())
Если это использовать в onClick ничего не получится, т.к. он вызывается когда кнопка уже отпускается. Во-вторых подобный код остановит UI поток и кнопка никогда не получит других событий, т.е. будет крутиться вечно (или пока его не прибьет ANR) :)
Здесь нужно ловить onTouch события ACTION_UP и ACTION_DOWN. А обработку делать в другом потоке.
Например, вот так:

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

		btn.setOnTouchListener(new OnTouchListener() {
			@Override
			public boolean onTouch(View v, MotionEvent event) {
			if ((v.getId()==R.id.bDurationPlus)&&(event.getAction() == MotionEvent.ACTION_DOWN)) {
					new Thread(new Runnable() {
						@Override
						public void run() {
							do {
								// ваши действия
							} while (btn.isPressed());
						}
					}).start();
				}
				return false;
			}
		});
Последний раз редактировалось AndreyI 30 ноя 2012, 07:29, всего редактировалось 2 раза.

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

Re: Как обработать press у батона?

Сообщение AndreyI » 30 ноя 2012, 06:16

Только не забывайте, что поскольку обработка идет не в UI потоке, то напрямую вносить изменения в экранные компоненты не в UI-потоке нельзя, это нужно делать через Handler

К примеру, если вам нужно поменять текст в поле некого TextView tv;
То в UI потоке создаем Handler, например, перед 5-й строкой можно вставить:

final Handler h= new Handler();

А в потоке обработки нажатия кнопки через него можно обращаться к UI потоку (правильней сказать - вставить свой код в очередь сообщений UI-потока).

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

h.post(new Runnable() {									
@Override
public void run() {
tv.setText("Button is pressed...");											
}
});

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

Re: Как обработать press у батона?

Сообщение rezak90 » 30 ноя 2012, 09:08

во-вторых подобный код остановит UI поток и кнопка никогда не получит других событий, т.е. будет крутиться вечно (или пока его не прибьет ANR)
я предполагал что автор сам уже допилит что нужно в другом потоке это делать
Только не забывайте, что поскольку обработка идет не в UI потоке, то напрямую вносить изменения в экранные компоненты не в UI-потоке нельзя, это нужно делать через Handler
для этого не обязательно так извращаться, у активити есть метод runOnUiThread() который можно вызвать с любого не ui потока
R.id.team
Политика на форуме запрещена

key4
Сообщения: 7
Зарегистрирован: 14 сен 2012, 14:58

Re: Как обработать press у батона?

Сообщение key4 » 30 ноя 2012, 11:53

Андрей,спасибо большое!

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

Re: Как обработать press у батона?

Сообщение AndreyI » 30 ноя 2012, 12:22

rezak90 писал(а): для этого не обязательно так извращаться, у активити есть метод runOnUiThread() который можно вызвать с любого не ui потока
С этим согласен, на одну строчку меньше писать (не нужно создавать Handler);
Это примерный аналог метода SwingUtilities.invokeLater в JAVA Swing только там он статический.

key4
Сообщения: 7
Зарегистрирован: 14 сен 2012, 14:58

Re: Как обработать press у батона?

Сообщение key4 » 08 дек 2012, 11:55

Продолжение:

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

public boolean onTouch(View v, MotionEvent event) {
		if ((v.getId()==R.id.bStart)&&(event.getAction() == MotionEvent.ACTION_DOWN)) {
			Thread thr = new Thread(new Runnable() {
				public void run() {
					// TODO Auto-generated method stub
					do {
						runOnUiThread(myrun);
					}
					while (bStart.isPressed());
				Log.d("MyLog", "Вышел из цикла");
					
			}
			}); 
			thr.start();
						
		}//if
			
		return false;
	}
	
	Runnable myrun =new Runnable() {
		
		public void run() {
			i++;
			tw.setText("count "+i);
				
			
		}
	};
Вот, как можно видеть, я продолжаю попытки разобраться с pressed, с помощью предыдущих советов. Однако в этой ситуации при нажатие и не отпускании кнопки bStart, я получаю "выход из цикла" :shock: Хотя должен сидеть в нем до !ispressed. Подскажите,пожалуйста..
Добавил

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

Log.d("MyLog", String.valueOf(bStart.isPressed()));
и увидел что в isPressed приходит false и это при нажатой -то кнопке?

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

Re: Как обработать press у батона?

Сообщение rezak90 » 08 дек 2012, 14:26

и увидел что в isPressed приходит false и это при нажатой -то кнопке?
она и будет false, её нужно устанавливать руками
R.id.team
Политика на форуме запрещена

key4
Сообщения: 7
Зарегистрирован: 14 сен 2012, 14:58

Re: Как обработать press у батона?

Сообщение key4 » 08 дек 2012, 16:24

Ничего не понимаю. Разве при нажатии кнопки isPressed не должно стать true?

Аватара пользователя
KamiSempai
Сообщения: 1339
Зарегистрирован: 17 фев 2012, 21:23
Откуда: Мордор

Re: Как обработать press у батона?

Сообщение KamiSempai » 08 дек 2012, 17:04

key4 писал(а):Ничего не понимаю. Разве при нажатии кнопки isPressed не должно стать true?
Заглянул в исходники. Оказывается событие onTouchEvent вызывается до установки Pressed значения true. Вы можете переопределить метод onTouchEvent и проверять isPressed после вызова метода суперкласса. Или поступить по простому, если event.getAction()==MotionEvent.ACTION_DOWN считать кнопку нажатой.
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

Ответить