我所拥有的是一个由按钮控制的搜索栏,而不是使用设置/获取进度的滑块。
当用户按下按钮时,我试图让搜索栏进度增加,然后当他们取下按钮时停止增加。我有一个关键的监听器上下检测。我只是不确定在哪里放置setprogress部分,如果我在ACTION_DOWN中放入一个循环,它然后循环而不是检测ACTION_UP,如果我有一个for循环的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 :(得分:0)
你需要能够在ACTION_DOWN中停止你的while循环,否则它会一直持续到99.
你的while循环也阻止了UI线程,所以我把它放在一个新的线程中(不知道如何在普通的Android上做到这一点,我使用Mono for Android),并在ACTION_UP事件发生时停止该线程,或者在你的while循环中再次检查它是否会破坏它。
在Mono for 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();
}