web-dev-qa-db-ja.com

Androidのイベント処理メソッドから返されるブール値の意味は何ですか

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では、多くのメソッドもブール値を返す必要があります。それらは同じ意味を持っていますか?

107
John Wang

ACTION_DOWNイベントからtrueを返す場合、そのジェスチャーの残りのイベントに興味があります。この場合の「ジェスチャー」とは、最後のACTION_UPまたはACTION_CANCELまでのすべてのイベントを意味します。 ACTION_DOWNからfalseを返すということは、イベントを望まないことを意味し、他のビューはそれを処理する機会を持つことになります。ビューが重複している場合、これは兄弟ビューになります。そうでない場合は、親にバブルアップします。

134
adamp

ドキュメントから: http://developer.Android.com/reference/Android/view/View.OnTouchListener.html#onTouch(Android.view.View 、Android.view.MotionEvent)

「リスナーがイベントを消費した場合はtrue、そうでない場合はfalse」

Trueを返すと、イベントが処理されます。 falseの場合、次のレイヤーに移動します。

22
Matthieu

ブール値は、イベントが消費されるかどうかを決定します。

はい、あなたは正しいです。 falseを返すと、次のリスナーがイベントを処理します。 trueを返す場合、イベントはリスナーによって消費され、次のメソッドには送信されません。

11
Falmarri

上記の答えはすべて正しいですが、結果は異なります。ビューが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"
        }
    }
}
_

ケース1 _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
_

ケース2 _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
_

ケース3 _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 [〜#〜]

3
Phan Van Linh

トラブルシューティングでほぼ1日を失いましたが、onTouch関数はtrueを使用すると2回、falseを使用すると1回呼び出されることがわかりました。

1
kamor

FromAndroid-document

注:Androidは最初にイベントハンドラーを呼び出し、次にクラス定義から適切なデフォルトハンドラーを呼び出します。そのため、これらのイベントリスナーからtrueを返すと、他のイベントリスナーへのイベントの伝播が停止し、ビューのデフォルトイベントハンドラーへのコールバックもブロックされます。したがって、trueを返したときにイベントを終了することを確認してください。

0
Brasc elok