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

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

Добавлено: 29 ноя 2012, 14:15
key4
Привет всем. Подскажите как поймать 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;
    	}
Не пашет, подскажите пожалуйста...

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

Добавлено: 29 ноя 2012, 20:31
Foenix
не знаю точно, но где-то в редакторе xml видела такую настройку - allow long press (разрешить долгое нажатие) - может поможет чем..

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

Добавлено: 29 ноя 2012, 21:52
rezak90

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

case btn1:
do{
//ваши действия
}while(btn1.isPressed())

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

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

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

Добавлено: 30 ноя 2012, 06:16
AndreyI
Только не забывайте, что поскольку обработка идет не в 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...");											
}
});

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

Добавлено: 30 ноя 2012, 09:08
rezak90
во-вторых подобный код остановит UI поток и кнопка никогда не получит других событий, т.е. будет крутиться вечно (или пока его не прибьет ANR)
я предполагал что автор сам уже допилит что нужно в другом потоке это делать
Только не забывайте, что поскольку обработка идет не в UI потоке, то напрямую вносить изменения в экранные компоненты не в UI-потоке нельзя, это нужно делать через Handler
для этого не обязательно так извращаться, у активити есть метод runOnUiThread() который можно вызвать с любого не ui потока

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

Добавлено: 30 ноя 2012, 11:53
key4
Андрей,спасибо большое!

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

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

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

Добавлено: 08 дек 2012, 11:55
key4
Продолжение:

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

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 и это при нажатой -то кнопке?

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

Добавлено: 08 дек 2012, 14:26
rezak90
и увидел что в isPressed приходит false и это при нажатой -то кнопке?
она и будет false, её нужно устанавливать руками

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

Добавлено: 08 дек 2012, 16:24
key4
Ничего не понимаю. Разве при нажатии кнопки isPressed не должно стать true?

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

Добавлено: 08 дек 2012, 17:04
KamiSempai
key4 писал(а):Ничего не понимаю. Разве при нажатии кнопки isPressed не должно стать true?
Заглянул в исходники. Оказывается событие onTouchEvent вызывается до установки Pressed значения true. Вы можете переопределить метод onTouchEvent и проверять isPressed после вызова метода суперкласса. Или поступить по простому, если event.getAction()==MotionEvent.ACTION_DOWN считать кнопку нажатой.