Androidでは、ほとんどのイベントリスナーメソッドはブール値を返します。その真/偽の値はどういう意味ですか?それはサブシーケンスイベントに何をもたらしますか?
class MyTouchListener implements OnTouchListener {
@Override
public boolean onTouch(View v, MotionEvent event) {
logView.showEvent(event);
return true;
}
}
上記の例に関して、onTouchメソッドでtrueを返す場合、すべてのタッチイベント(DOWN、UP、MOVEなど)がlogViewに従ってキャプチャされていることがわかりました。反対に、falseを返すと、1つのDOWNイベントがキャプチャされます。そのため、falseを返すと、イベントの伝播が妨げられるようです。私は正しいですか?
さらに、OnGestureListenerでは、多くのメソッドもブール値を返す必要があります。それらは同じ意味を持っていますか?
ACTION_DOWN
イベントからtrue
を返す場合、そのジェスチャーの残りのイベントに興味があります。この場合の「ジェスチャー」とは、最後のACTION_UP
またはACTION_CANCEL
までのすべてのイベントを意味します。 ACTION_DOWN
からfalse
を返すということは、イベントを望まないことを意味し、他のビューはそれを処理する機会を持つことになります。ビューが重複している場合、これは兄弟ビューになります。そうでない場合は、親にバブルアップします。
ドキュメントから: http://developer.Android.com/reference/Android/view/View.OnTouchListener.html#onTouch(Android.view.View 、Android.view.MotionEvent)
「リスナーがイベントを消費した場合はtrue、そうでない場合はfalse」
Trueを返すと、イベントが処理されます。 falseの場合、次のレイヤーに移動します。
ブール値は、イベントが消費されるかどうかを決定します。
はい、あなたは正しいです。 falseを返すと、次のリスナーがイベントを処理します。 trueを返す場合、イベントはリスナーによって消費され、次のメソッドには送信されません。
上記の答えはすべて正しいですが、結果は異なります。ビューがclickable
であるかどうかはclickable
です
例、私はLinearLayout
に1 Button
と1 TextView
を含む
_<LinearLayout
Android:id="@+id/linearlayout_root"
xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:background="#0aa"
Android:orientation="vertical">
<Button
Android:id="@+id/button_click"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:padding="40dp"
Android:text="Button Click"
Android:textSize="20sp" />
<TextView
Android:id="@+id/textview_click"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:padding="40dp"
Android:text="TextView Click"
Android:textSize="20sp"
Android:background="#e4e4e4"
/>
</LinearLayout>
_
アクティビティには、次のようなコードがあります
_class MainActivity : AppCompatActivity() {
val TAG = "TAG"
@SuppressLint("ClickableViewAccessibility")
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
findViewById<LinearLayout>(R.id.linearlayout_root).setOnTouchListener { v, event ->
Log.i(TAG, "LinearLayout onTouch event " + getDisplayAction(event.action))
false
}
findViewById<Button>(R.id.button_click).setOnTouchListener { v, event ->
Log.i(TAG, "Button onTouch event " + getDisplayAction(event.action))
false
}
findViewById<TextView>(R.id.textview_click).setOnTouchListener { v, event ->
Log.i(TAG, "TextView onTouch event " + getDisplayAction(event.action))
false
}
}
private fun getDisplayAction(action: Int): String {
return when (action) {
MotionEvent.ACTION_DOWN -> "DOWN"
MotionEvent.ACTION_MOVE -> "MOVE"
MotionEvent.ACTION_UP -> "UP"
MotionEvent.ACTION_CANCEL -> "CANCEL"
MotionEvent.ACTION_OUTSIDE -> "OUTSIDE"
else -> "UNKNOWN"
}
}
}
_
Linear onTouch return **FALSE**
_、_Button onTouch return **FALSE**
_、_TextView onTouch return **FALSE**
_ボタンをクリック
_I/TAG: Button onTouch eventDOWN
I/TAG: Button onTouch eventMOVE
I/TAG: Button onTouch eventUP
_
TextViewをクリックします
_TAG: TextView onTouch eventDOWN
TAG: LinearLayout onTouch eventDOWN
_
LinearLayoutをクリックします
_TAG: LinearLayout onTouch eventDOWN
_
Linear onTouch return **FALSE**
_、_Button onTouch return **TRUE**
_、_TextView onTouch return **TRUE**
_ボタンをクリック
_Similar to case 1
_
TextViewをクリックします
_TAG: TextView onTouch event DOWN
TAG: TextView onTouch event MOVE
TAG: TextView onTouch event UP
_
LinearLayoutをクリックします
_Similar to case 1
_
Linear onTouch return **TRUE**
_、_Button onTouch return **FALSE**
_、_TextView onTouch return **FALSE**
_ボタンをクリック
_Similar to case 1
_
TextViewをクリックします
_TAG: TextView onTouch event DOWN
TAG: LinearLayout onTouch event DOWN
TAG: LinearLayout onTouch event MOVE
TAG: LinearLayout onTouch event UP
_
LinearLayoutをクリックします
_TAG: LinearLayout onTouch event DOWN
TAG: LinearLayout onTouch event MOVE
TAG: LinearLayout onTouch event UP
_
TextView
のデフォルトは_not clickable
_です。xmlで_Android:clickable="true"
_を設定するとクリック可能になります[〜#〜]または[〜#〜]textView.setOnClickListener(...)
を設定するとevent MOVE
_は私のログより多くを呼び出すことができます(タップする方法に基づきます)onTouch
return true
またはビューがclickable
の場合、ビューはallonTouchEvent
を受け取りますonTouch
return false
でビューがclickable
ではない場合、ビューはNEXTを受信しませんonTouchEvent(親が受信する場合があります)それ)お役に立てば幸いです
[〜#〜] demo [〜#〜]
トラブルシューティングでほぼ1日を失いましたが、onTouch関数はtrueを使用すると2回、falseを使用すると1回呼び出されることがわかりました。
FromAndroid-document:
注:Androidは最初にイベントハンドラーを呼び出し、次にクラス定義から適切なデフォルトハンドラーを呼び出します。そのため、これらのイベントリスナーからtrueを返すと、他のイベントリスナーへのイベントの伝播が停止し、ビューのデフォルトイベントハンドラーへのコールバックもブロックされます。したがって、trueを返したときにイベントを終了することを確認してください。