Android의 이벤트 처리 방법에서 반환되는 부울 값의 의미는 무엇입니까? return true;

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를 반환하면 DOWN 이벤트가 캡처 된 것입니다. 따라서 false를 반환하면 이벤트가 전파되지 않는 것 같습니다. 나 맞아 ?

또한 OnGestureListener 에서 많은 메서드가 부울 값도 반환해야합니다. 그들은 같은 의미를 가지고 있습니까?



답변

이벤트 true에서 돌아 오면 ACTION_DOWN해당 제스처의 나머지 이벤트에 관심이 있습니다. 이 경우 ‘제스처’는 결승전 ACTION_UP또는 까지의 모든 이벤트를 의미합니다 ACTION_CANCEL. 에서 돌아온다 false는 것은 ACTION_DOWN이벤트를 원하지 않는다는 것을 의미하며 다른 뷰는 이벤트를 처리 할 기회를 갖게됩니다. 겹치는 뷰가있는 경우 형제 뷰가 될 수 있습니다. 그렇지 않으면 부모에게 버블 링됩니다.


답변

문서에서 : http://developer.android.com/reference/android/view/View.OnTouchListener.html#onTouch(android.view.View , android.view.MotionEvent)

“리스너가 이벤트를 소비 한 경우 true, 그렇지 않으면 false입니다.”

true를 반환하면 이벤트가 처리됩니다. 거짓이면 다음 레이어로 이동합니다.


답변

부울 값은 이벤트 소비 여부를 결정합니다.

네 맞습니다. false를 반환하면 다음 리스너가 이벤트를 처리합니다. true를 반환하면 이벤트가 리스너에 의해 소비되고 다음 메서드로 전송되지 않습니다.


답변

위의 모든 대답은 정확하지만 결과는 View가 clickable있는지 여부입니다.clickable

, 나는 이것 과 같은 LinearLayout1 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우리가 설정 한 경우이 클릭 될 것입니다, android:clickable="true"XML로 또는 우리가 설정 한 경우textView.setOnClickListener(...)
  • 디버그 할 때 event MOVE내 로그보다 더 많이 호출 할 수 있습니다 (탭하는 방법에 따라 다름)

요약

  • onTouch반환 true또는보기는 clickable
    ,보기는 모두 수신 합니다. onTouchEvent
  • onTouchreturn false및 view is not clickable, view will not receive NEXT onTouchEvent (it ‘s parent may receive it)

데모가 도움이
되기를 바랍니다.


답변

나는 문제 해결에서 거의 하루를 잃었지만 여전히 내 onTouch 기능이 true를 사용할 때 2 번, false를 사용할 때 1 번 호출된다는 것을 알았습니다.


답변

에서 안드로이드 문서 :

참고 : 안드로이드 먼저 다음 클래스 정의의 두 번째에서 적절한 기본 핸들러를 이벤트 핸들러를 호출합니다. 따라서 이러한 이벤트 리스너에서 true를 반환하면 다른 이벤트 리스너로의 이벤트 전파가 중지되고 뷰의 기본 이벤트 핸들러에 대한 콜백도 차단됩니다. 따라서 true를 반환하면 이벤트를 종료해야합니다.