通常、ロングクリックを検出する正しい方法は、
View.OnLongClickListenerを実装することです。これは、自分で検出するよりも簡単でエラーが発生しにくく、アプリがシステムの残りの部分にうまく適合することを保証します。
customView
の場合implements View.OnLongClickListener
、クラス宣言に追加setOnLongClickListener(this);
し、コンストラクターに追加して、onLongClick()
メソッドをクラスに追加します。
public boolean onLongClick (View v) {
// Handle long-click
}
カスタムでない場合View
は、次のようにリスナーを追加できます。
theView.setLongClickable(true);
theView.setOnLongClickListener(new View.OnLongClickListener() {
public boolean onLongClick(View v) {
// Handle long-click
}
});
更新:わかりました、掘り下げました。これは、これまでに使用したすべてのビューで正しい方法ですが、実際には、質問者が使用している SeekBars では機能しません。この事実はドキュメントには記載されていませんSeekBar
が、実験によりそれが正しいことが示され、ソース コードを掘り下げると、その理由が示されSeekBar.onTouchEvent()
ますsuper.onTouchEvent()
。必要に応じて呼び出されますView.onTouchEvent()
。performLongClick()
必要に応じて実装する方法は、Handler.postDelayed()
. ACTION_DOWN でRunnable
、長押しを処理するa を (たとえば 3000 ミリ秒の遅延で) 投稿Handler
し、ACTION_UP でそれをキャンセルします。そのため、遅延未満のプレスは最終的に を呼び出すことにはなりませんRunnable
が、ACTION_UP が遅延後に発生しなかった場合は、それが発生します。
そうは言っても、これを行うことをまったく考え直すように警告します。を長押しするとはどういう意味SeekBar
ですか? ユーザーが「親指」を遅延よりも長くドラッグしている場合、突然、おそらく意図されていない長押しが発生します。親指を動かすたびに遅延をキャンセルしてリセットすることができ、正確に 1 つの位置で数秒間長押しする必要があります。しかし、完全に静止していることはめったにありません。実際、親指を数秒間動かさずに保持することは困難です。したがって、遅延をリセットする親指の位置の変更を最小限に抑えることができます。やむを得ない場合はそうしますが、非常に奇妙なユーザー エクスペリエンスだと言わざるを得ません。