অ্যান্ড্রয়েডে ইভেন্ট-হ্যান্ডলিং পদ্ধতি থেকে বুলিয়ান মানটির অর্থ কী


110

অ্যান্ড্রয়েডে, বেশিরভাগ ইভেন্ট শ্রোতার পদ্ধতিগুলি একটি বুলিয়ান মান দেয়। সত্য / মিথ্যা মান বলতে কী বোঝায়? এটি পরবর্তী ঘটনাগুলিতে কী ঘটবে?

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

উপরের উদাহরণটি সম্পর্কে, যদি অন ​​টাচ পদ্ধতিতে সত্য হয় তবে আমি দেখতে পেয়েছি যে প্রতিটি স্পর্শ ইভেন্ট (ডাউন, ইউপি, সরানো ইত্যাদি) আমার লগভিউ অনুসারে ক্যাপচার করা হয়েছে । বিপরীতে, যদি মিথ্যা ফেরত দেয় তবে এককভাবে ডাউন ইভেন্টটি ক্যাপচার করা হয়েছে। সুতরাং মনে হয় মিথ্যা ফেরত ঘটনাটি প্রচার করতে বাধা দেবে। আমি কি সঠিক ?

তদ্ব্যতীত, একটি অন্জেকচারলিস্টারে অনেকগুলি পদ্ধতির বুলিয়ান মানও ফিরিয়ে দিতে হয়। তাদের কি একই অর্থ আছে?

উত্তর:


140

যদি আপনি trueকোনও ACTION_DOWNইভেন্ট থেকে ফিরে যান তবে আপনি সেই অঙ্গভঙ্গির বাকি ইভেন্টগুলিতে আগ্রহী। এই ক্ষেত্রে একটি "অঙ্গভঙ্গি" অর্থ চূড়ান্ত ACTION_UPবা সমস্ত অবধি সমস্ত ইভেন্ট ACTION_CANCELfalseকোনও ACTION_DOWNউপায়ে ফিরে আসা আপনি ইভেন্টটি চান না এবং অন্যান্য দর্শনগুলি এটি পরিচালনা করার সুযোগ পাবে। আপনার যদি ওভারল্যাপিং ভিউ থাকে তবে এটি একটি ভাইবাল ভিউ হতে পারে। তা না হলে এটি পিতামাতার উপর বুদবুদ হবে।


3
অ্যাডাম্প, ইভেন্টগুলি গ্রহণ করে চালিয়ে যাওয়ার এবং অনুষ্ঠানের মধ্য দিয়ে যাওয়ার কি কোনও উপায় আছে?
টিকোফাব

@ টিটফ্যাব না, বর্তমানে ইভেন্টগুলি প্রাপ্ত পিতামাতার কেবলমাত্র ভবিষ্যতের ইভেন্টগুলি ভঙ্গিমাতে বাধা দিতে পারে। (অবশ্যই, আপনি সর্বদা আপনার নিজস্ব পুনর্নির্দেশ সিস্টেমগুলি প্যারেন্ট ভিউতে তৈরি করতে পারেন তবে আপনি কী করছেন তা যদি আপনি সত্যিই না জেনে থাকেন তবে আমি এটিকে সুপারিশ করব না :) :))
অ্যাডাম্প

@ অ্যাডাম্প আমি সত্য ফিরে আসার সময় 2 বার এবং যখন আমি মিথ্যা প্রত্যাবর্তন করি তখনই 1 বার কেন বলা হয় তার কারণ আমি ভাবতে পারি না।
ভার্গব ঝাভেরি

1
@ অ্যাডাম্প: আমি অ্যাকশন_ডাউন থেকে মিথ্যা ফিরিয়ে দিচ্ছি তবে আমার অ্যাকশন_উপ ট্রিগার এবং এক্সিকিউট হয়ে যাচ্ছে।
মহন্তেশ এম আম্বি

আমি কি এই উত্তরটি ভুল পাচ্ছি বা অন্য সবাই ... এই উত্তরটি বলেছে যে সত্যিকারের প্রত্যাবর্তন মানে শক্ত ইভেন্ট গ্রাস হয় না। তবে সত্যটি সম্পূর্ণ বিপরীত।
কাই ওয়াং

23

ডকুমেন্টেশন থেকে: http://developer.android.com/references/android/view/View.OnTouchListener.html#onTouch(android.view.View , android.view.MotionEvent)

"সত্য যদি শ্রোতা ইভেন্টটি গ্রাস করে, অন্যথায় মিথ্যা।"

যদি আপনি সত্য ফিরে পান, ইভেন্টটি প্রক্রিয়া করা হবে। যদি মিথ্যা হয় তবে এটি নীচের অংশে চলে যাবে।


12

বুলিয়ান মান নির্ধারণ করে যে ইভেন্টটি গ্রাস করা হয়েছে কি না।

হ্যাঁ আপনি ঠিক বলেছেন। আপনি যদি মিথ্যা প্রত্যাবর্তন করেন, পরবর্তী শ্রোতা ইভেন্টটি পরিচালনা করবেন। যদি এটি সত্য হয়ে যায়, ইভেন্টটি আপনার শ্রোতার দ্বারা গ্রাস করা হবে এবং পরবর্তী পদ্ধতিতে প্রেরণ করা হবে না।


2
এটা মিথ্যা। trueএর অর্থ আপনি ইভেন্টটি গ্রাস করেছেন এবং অঙ্গভঙ্গিতে থাকা অন্যান্য ইভেন্টগুলি চান - অন্যান্য শ্রোতা / মতামত ইভেন্টগুলি গ্রহণ করবে না। falseমানে অন্য কাউকে ইভেন্টটি পরিচালনা করতে দেওয়া। যদিও এটি তার চেয়ে কিছুটা বেশি নির্দিষ্ট; আমার উত্তর দেখুন।
1:59 এড্যাম্প

আমি যা বলেছিলাম তা ঠিক কীভাবে হয় না?
ফালমারি

1
আপনি যা বলেছেন তা বিপরীত হয়েছে। :)
21

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

টেক্সটভিউতে ক্লিক করুন

TAG: TextView onTouch eventDOWN
TAG: LinearLayout onTouch eventDOWN

লিনিয়ারলাউট ক্লিক করুন

TAG: LinearLayout onTouch eventDOWN

কেস 2 Linear onTouch return **FALSE**, Button onTouch return **TRUE**,TextView onTouch return **TRUE**

বাটনে ক্লিক করুন

Similar to case 1

টেক্সটভিউতে ক্লিক করুন

TAG: TextView onTouch event DOWN
TAG: TextView onTouch event MOVE
TAG: TextView onTouch event UP

লিনিয়ারলাউট ক্লিক করুন

Similar to case 1

কেস 3 Linear onTouch return **TRUE**, Button onTouch return **FALSE**,TextView onTouch return **FALSE**

বাটনে ক্লিক করুন

Similar to case 1

টেক্সটভিউতে ক্লিক করুন

TAG: TextView onTouch event DOWN
TAG: LinearLayout onTouch event DOWN
TAG: LinearLayout onTouch event MOVE
TAG: LinearLayout onTouch event UP

লিনিয়ারলাউট ক্লিক করুন

TAG: LinearLayout onTouch event DOWN
TAG: LinearLayout onTouch event MOVE
TAG: LinearLayout onTouch event UP

বিঃদ্রঃ

  • ডিফল্ট TextViewহ'ল not clickable, আমরা যখন android:clickable="true"এক্সএমএল বা সেট করি তখন সেটি ক্লিকযোগ্য হয় abletextView.setOnClickListener(...)
  • আপনি যখন ডিবাগ করেন, event MOVEআমার লগের চেয়ে বেশি কল করতে পারেন (এটি আপনি কীভাবে ট্যাপ করেন তার ভিত্তিতে)

সারসংক্ষেপ

  • onTouchরিটার্ন trueবা ভিউ হচ্ছে clickable , ভিউ সব পাবেন onTouchEvent
  • onTouchফিরে আসুন falseএবং দেখুন তা নয় clickable, ভিউ টাচএভেন্টে নেক্সট পাবেন না (এটি পিতামাতার এটি পেতে পারে)

আশা করি এটি ডেমোকে সহায়তা করবে


1
এই উত্তর হওয়া উচিত! এই ধরণের বিশদ ব্যাখ্যার জন্য আপনাকে ধন্যবাদ
রহস্যময়_অ্যান্ড্রয়েড

1

আমি সমস্যা সমাধানের মধ্যে প্রায় একদিন হারিয়েছি, তবুও আমি জানতে পেরেছি যে সত্য অন্বেষণ করার সময় আমার অন্টচ ফাংশনটি 2 বার এবং মিথ্যা ব্যবহার করার সময় 1 বার বলা হয়।


আপনি কারণ খুঁজে পেতে পারেন?
ভার্গব ঝাভেরি

পরীক্ষা event.getAction()কারন যদি তুমি ফিরে falseACTION_DOWN ইভেন্টে, ACTION_UP ঘটনা শ্রোতা দ্বারা উপেক্ষা করা হয়
doodeec

0

থেকে অ্যান্ড্রয়েড-ডকুমেন্ট :

নোট: অ্যান্ড্রয়েড ইভেন্ট হ্যান্ডলার প্রথম এবং তারপর বর্গ সংজ্ঞা দ্বিতীয় থেকে উপযুক্ত ডিফল্ট পরিচালক কল হবে। এই হিসাবে, এই ইভেন্ট শ্রোতাদের কাছ থেকে সত্য প্রত্যাবর্তন করা ইভেন্টের অন্যান্য শ্রোতার কাছে ইভেন্টটির প্রচার বন্ধ করে দেবে এবং ভিউতে ডিফল্ট ইভেন্ট হ্যান্ডলারের কলব্যাকটিকেও ব্লক করে দেবে। সুতরাং আপনি সত্য ফিরে যখন আপনি ইভেন্টটি শেষ করতে চান তা নিশ্চিত হন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.