एंड्रॉइड में एक इवेंट-हैंडलिंग विधि से लौटे बूलियन मूल्य का अर्थ क्या है


110

Android में, अधिकांश ईवेंट श्रोता विधियाँ एक बूलियन मान लौटाती हैं। वह सही / गलत मूल्य क्या है? इसके बाद की घटनाओं का क्या परिणाम होगा?

class MyTouchListener implements OnTouchListener {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        logView.showEvent(event);
        return true;
    }
}

उपरोक्त उदाहरण के बारे में, अगर ऑनटू विधि में सही है, तो मैंने पाया कि हर टच इवेंट (DOWN, UP, MOVE, इत्यादि) को मेरे logView के अनुसार कैप्चर किया गया है । इसके विपरीत, यदि झूठे वापस आते हैं, तो आमतौर पर DOWN इवेंट कैप्चर किया जाता है। तो यह प्रतीत होता है कि झूठी वापसी घटना को प्रचारित करने से रोकेगी। क्या मैं सही हूँ ?

इसके अलावा, एक OnGestureListener में , कई तरीकों से बूलियन मान भी वापस करना पड़ता है। क्या उनका एक ही अर्थ है?

जवाबों:


140

यदि आप trueकिसी ACTION_DOWNघटना से लौटते हैं तो आप उस इशारे में बाकी घटनाओं में रुचि रखते हैं। इस मामले में एक "इशारा" का अर्थ है अंतिम ACTION_UPया जब तक सभी घटनाएँ ACTION_CANCELfalseऐसे ACTION_DOWNसाधनों से लौटकर आप घटना नहीं चाहते हैं और अन्य विचारों के पास इसे संभालने का अवसर होगा। यदि आपके पास अतिव्यापी विचार हैं तो यह एक साहसी दृश्य हो सकता है। यदि नहीं, तो यह माता-पिता को बुलबुला देगा।


3
एडैम्प, क्या घटनाओं को प्राप्त करने और घटनाओं को जारी रखने का एक तरीका है?
टिकोफैब

@ticofab नहीं, केवल वर्तमान में प्राप्त होने वाले दृश्य के माता-पिता इशारे में भविष्य की घटनाओं को रोक सकते हैं। (बेशक, आप हमेशा अपने निजी रीडायरेक्ट सिस्टम एक माता पिता के ध्यान में रखते हुए निर्माण कर सकते हैं, लेकिन मैं यह सिफारिश नहीं होगा जब तक आप वास्तव में पता है कि तुम क्या कर रहे हैं :)।)
adamp

@ आदम्प मैं इस कारण के बारे में नहीं सोच सकता कि क्यों सही होने पर 2 बार कहा जाता है और 1 बार जब मैं झूठे वापस लौटता हूं।
भार्गव झावेरी

1
@adamp: मैं ACTION_DOWN से गलत लौट रहा हूं, लेकिन मेरा ACTION_UP ट्रिगर और निष्पादित हो रहा है।
महंतेश एम। अंबी

क्या मुझे यह उत्तर गलत मिल रहा है या बाकी सब है ... इस उत्तर में कहा गया है कि सही मायने में कठिन घटना का सेवन नहीं किया जाता है। लेकिन सच्चाई पूरी तरह से उलट है।
काई वांग

23

प्रलेखन से: http://developer.android.com/reference/android/view/View.OnTouchListener.html#onTouch(android.view.View , android.view.MotionEvent)

"सच है अगर श्रोता ने घटना को खा लिया है, अन्यथा गलत है।"

यदि आप सही लौटते हैं, तो ईवेंट संसाधित किया जाता है। यदि गलत है, तो यह अगली परत के नीचे जाएगा।


12

बूलियन मान निर्धारित करता है कि घटना का उपभोग किया जाता है या नहीं।

हाँ आप सही हैं। यदि आप गलत तरीके से लौटते हैं, तो अगला श्रोता घटना को संभालता है। यदि यह सही है, तो घटना आपके श्रोता द्वारा भस्म कर दी जाती है और अगली विधि को नहीं भेजी जाती है।


2
यह गलत है। trueइसका मतलब है कि आपने ईवेंट का उपभोग किया है और बाकी घटनाओं को इशारे में चाहते हैं - अन्य श्रोताओं / विचारों को ईवेंट प्राप्त नहीं होंगे। falseमतलब किसी और को घटना को संभालने दें। हालांकि यह वास्तव में थोड़ा अधिक विशिष्ट है; मेरा जवाब देखिए।
1

यह कैसा है जो मैंने कहा नहीं है?
फल्मरी

1
आपने जो कहा वह उलटा है। :)
adamp

4

उपरोक्त सभी उत्तर सही हैं, लेकिन परिणाम भिन्न है यदि दृश्य है 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"एक्सएमएल में या जब हम सेटtextView.setOnClickListener(...)
  • जब आप डीबग करते हैं, event MOVEतो मेरे लॉग से अधिक कॉल कर सकते हैं (यह आपके टैप करने के आधार पर)

सारांश

  • onTouchवापसी trueया दृश्य है clickable , देखें सभी प्राप्त करेंगे onTouchEvent
  • onTouchवापसी falseऔर दृश्य नहीं है clickable, दृश्य NEXT onTouchEvent प्राप्त नहीं करेगा (यह माता-पिता इसे प्राप्त कर सकते हैं)

आशा है कि यह DEMO की मदद करेगा


1
इसका उत्तर होना चाहिए! इस तरह की एक विस्तृत व्याख्या के लिए धन्यवाद
मिस्टीरियस_एंड्रॉयड

1

मैंने समस्या निवारण में लगभग एक दिन गंवा दिया, फिर भी मुझे पता चला, कि मेरे onTouch फंक्शन को 2 बार कहा जाता है जब सही का उपयोग किया जाता है और 1 का उपयोग करते समय।


क्या आप इसका कारण जान सकते हैं?
भार्गव झावेरी

चेक करें event.getAction()क्योंकि यदि आप falseACTION_DOWN घटना पर वापस आते हैं , तो ACTION_UP घटना को श्रोता द्वारा नजरअंदाज कर दिया जाता है
doodeec

0

से एंड्रॉयड-दस्तावेज़ :

ध्यान दें: Android ईवेंट हैंडलर्स पहले और उसके बाद वर्ग परिभाषा दूसरे से उचित डिफ़ॉल्ट हैंडलर कॉल करेंगे। जैसे, इन ईवेंट श्रोताओं से सही तरीके से लौटने पर ईवेंट का प्रचार अन्य ईवेंट श्रोताओं के लिए बंद हो जाएगा और कॉलबैक को डिफ़ॉल्ट ईवेंट हैंडलर में व्यू में ब्लॉक कर देगा। इसलिए निश्चित रहें कि आप घटना को समाप्त करना चाहते हैं जब आप सही लौटें।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.