2012-06-29 3 views
0

У меня есть панель поиска, которая управляется кнопками, а не слайдером, используя команду set/get progress.На клавиатуре с нажатой клавишей вверх до

Я пытаюсь увеличить скорость поиска, когда пользователь нажимает кнопку, а затем перестает увеличиваться, когда они поднимают кнопку. У меня есть слушатель onkey, который обнаруживает вверх и вниз. Я просто не знаю, где поставить часть setprogress, если я вложу петлю в ACTION_DOWN, то это будет цикл, а не обнаружение ACTION_UP, похоже, что это произойдет, если у меня есть цикл while для ACTION_DOWN.

Я думаю, что мне также может потребоваться установить refreshDraweableState, но я тоже не так много смотрю с этим.

Потенциально я слишком часто пытаюсь сбиться с поисковыми знаками, но я был бы признателен за любую помощь/совет. Благодаря!

Это мой клавишник, в котором я в основном возился.

public boolean onKey(View view, int keyCode, KeyEvent event) { 
    builder.setLength(0); 
    switch (event.getAction()){ 
     case KeyEvent.ACTION_DOWN: 
      builder.append(event.getKeyCode()); 
      String text = builder.toString(); 
      Log.w("seekbar", text); 
      textView.setText(text); 
      while (sk.getProgress() < 100){ 
       sk.setProgress(sk.getProgress()+1); 
       sk.refreshDrawableState(); 
       try { 
        Thread.sleep(50); 
       } catch (InterruptedException e) { 
        break; 
       } 
      } 
      break; 
     case KeyEvent.ACTION_UP: 
      break; 
    } 
    return true; 
} 

}

ответ

0

Вы должны быть в состоянии остановить свой цикл, а в ACTION_DOWN даже, в противном случае он будет просто продолжать идти до тех пор, пока не достигнет 99.

и ваши блоки петли в то время как поток пользовательского интерфейса поэтому я бы поместил его в новый поток (не уверен, как это сделать на обычном Android, я использую Mono для Android) и останавливаю этот поток, когда происходит событие ACTION_UP, или помещает еще одну проверку в ваш цикл while, который его разрывает.

В Mono для Android, что будет сделано примерно так:

public bool OnKey(View view, int keyCode, KeyEvent e) 
{ 
    switch(e.Action) 
    { 
     case KeyEventAction.Down: 
      Start(); 
     break; 
     case KeyEventAction.Up: 
      Stop(); 
     break; 
    } 
} 

private volatile bool _shouldStop; 

public void IncreaseProgress() 
{ 
    while (!_shouldStop && sk.Progress < 100) 
    { 
     //Working 
     RunOnUiThread(() => { 
      sk.Progress = sk.Progress+1; 
      sk.RefreshDrawableState(); 
     }); 
     Thread.Sleep(50); 
    } 
    //Terminating 
} 

public void Start() 
{ 
    _shouldStop = false; 
    Thread workerThread = new Thread(IncreaseProgress); 
    workerThread.Start(); 
} 

public void Stop() 
{ 
    _shouldStop = true; 
    workerThread.Stop(); 
} 
Смежные вопросы