Страница 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, я получаю "выход из цикла"

Хотя должен сидеть в нем до !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 считать кнопку нажатой.