5

Androidでは、シークバーにロングクリックリスナーを登録することはできますか?

私はこれをしました:

mySeekBar.setLongClickable(true);
mySeekBar.setOnLongClickListener(new OnLongClickListener() {
   public boolean onLongClick (View v) {
    Log.d("TEST", "Get a long click event!!!!!!!!!!!!");
 }
});

しかし、デバッグ印刷ステートメントがまったく表示されません。どうすればそれを達成できるかについて何か考えはありますか?

ありがとうございました。

4

3 に答える 3

2

ドキュメントには記載されていませんが、クリック リスナーとロングクリック リスナーの両方が SeekBars でサポートされていないことを実験的に判断しました。それらは ProgressBars でサポートされています。

ソース コードを掘り下げると、その理由がわかりSeekBar.onTouchEvent()ますsuper.onTouchEvent()。その中にView.onTouchEvent()ありperformClick()performLongClick()必要に応じて呼ばれます。したがって、上でのロングクリックを処理する唯一の方法SeekBarは、手動で検出することです。

私自身の考えでは、 a のロングクリック ハンドラーを持つSeekBarことは実際には意味がありません。ユーザーがロングクリックのしきい値/遅延よりも長く「親指」をドラッグしている場合、突然、おそらく意図されていない長押しが発生します。親指を動かすたびに遅延をキャンセルしてリセットできます。正確に 1 つの位置で数秒間長押しする必要があります。しかし、完全に静止していることはめったにありません。実際、親指を数秒間動かさずに保持することは困難です。したがって、遅延をリセットする親指の位置の変更を最小限に抑えることができます。やむを得ない場合はそうしますが、非常に奇妙なユーザー エクスペリエンスだと言わざるを得ません。Android には、長押しが重要であるとユーザーが期待する場所がたくさんありますが、SeekBarそうではありません。

于 2012-06-14T01:39:47.807 に答える
1

AFAICT これは、 で行うことはできませんOnLongClickListener。ドキュメントには動作しないとは書かれていません、私はこの例を見たことがありません (また、自分で動作させることもできませんでした)。

考えられる回避策 (達成したい内容に応じて) はOnSeekBarChangeListener、長いクリックスルーonStartTrackingTouch/onStopTrackingTouchコールバックの処理を使用することです。

于 2012-05-18T08:28:38.580 に答える
0

または、SeekBar をサブクラス化し、独自の onLongClick リスナーを実装することもできます。これは気弱な人向けではありませんが、テリー・ロングは回り道をしたようです。(少なくとも、彼は持っていると思います。私の北京語はかなり錆びています。)彼は 4 つのステップを示しています。

  • サブクラス SeekBar、setOnLongClickListener をオーバーライドしてそれを強制終了
  • 目的の「長いクリック」時間後に終了するスレッドを作成します
  • スレッドの終了時に発生する「長いクリック」イベントを作成します
  • SeekBar OnSeekBarChangeListener イベント ハンドラをオーバーライドしてイベントを処理する

私は彼のコードを試したことはありませんが、基本的な考え方は適切に見えます。彼は、SeekBar の OnSeekBarChangeListener をオーバーライドするのを避けるために、AbsSeekBar でこれを実行しようとしたのではないかと思いましたが、なぜそうしなかったのかについては語っていません (繰り返しになりますが、AFAICT)。

しかし、私にはやり過ぎのように聞こえます。ProgressBar長いクリックをサポートしています。それを何とか使えないか?

于 2012-05-18T13:58:22.933 に答える