0

私が持っているのは、進行状況の設定/取得を使用するスライダーではなく、ボタンで制御されるシークバーです。

ユーザーがボタンを押すとシークバーの進行状況が増加し、ボタンを離すと増加を停止しようとしています。アップとダウンを検出する onkey リスナーがあります。ACTION_DOWN にループを配置すると、ACTION_UP を検出するのではなくループします。ACTION_DOWN の while ループがある場合、同じことが発生するようです。

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;
}

}

4

1 に答える 1

0

ACTION_DOWN でも while ループを停止できる必要があります。そうしないと、99 に達するまで続行されます。

また、while ループは UI スレッドをブロックするので、それを新しいスレッドに入れます (プレーンな Android でそれを行う方法がわからないので、Android では Mono を使用します)、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();
}
于 2012-06-29T15:37:29.990 に答える