onTouchListener সতর্কতা: অন ক্লিক করে একটি ক্লিক সনাক্ত করা হলে # পারফরম্যান্স ক্লিক ক্লিক করুন


108

আমি একটি তৈরি করেছি onTouchListener। দুর্ভাগ্যক্রমে অন টাচ () পদ্ধতিটি throwsআমাকে একটি সতর্কতা:

com/calculator/activitys/Calculator$1#onTouch should call View#performClick when a click is detected

এর মানে কি? আমি এই সতর্কতা সম্পর্কে কোনও তথ্য পাইনি। এখানে পুরো কোডটি রয়েছে:

LinearLayout llCalculatorContent = (LinearLayout) fragmentView.findViewById(R.id.calculator_content);

llCalculatorContent.setOnTouchListener(new View.OnTouchListener() {

    @Override
    public boolean onTouch(View v, MotionEvent event) {
        Tools.hideKeyboard(getActivity(), getView());
        getView().clearFocus();
        return false;
    }   
});

17
আপনি কেবল কলটি দিয়ে সতর্কতা থেকে মুক্তি পেতে চান v.performClick()। বাস্তবায়নটি সামান্য শব্দ বাজবে (আপনি যদি এটি আপনার ডিভাইসে এটি সক্ষম করে থাকেন) এবং অন ক্লিকলিস্টনারকে কল করুন যে আপনি সম্ভবত ওভাররাইড করেন নি
ব্ল্যাকবেল্ট

আপনার উত্তরটি সঠিক ছিল। আপনাকে ধন্যবাদ
ট্রজি গ্রাজে

উত্তর:


128

আপনি এখানে যান:

public boolean onTouch(View v, MotionEvent event) {
    switch (event.getAction()) {
    case MotionEvent.ACTION_DOWN:
        //some code....
        break;
    case MotionEvent.ACTION_UP:
        v.performClick();
        break;
    default:
        break;
    }
    return true;
}

14
এটি কেবল তখনই বলা হবে না যখন ইভেন্ট == মোশনএভেন্ট.অ্যাকশন_আপ, বা এরকম কিছু? এছাড়াও, "মিথ্যা" ফিরিয়ে দেওয়া কি আসলে আসল ক্লিক করার পদ্ধতিটিকে কল করে না, তার পরিবর্তে আপনার আসলে "সত্য" ফিরে আসা উচিত?
অ্যান্ড্রয়েড বিকাশকারী

@ লম্বিলং ওয়েল আপনি যদি চান তবে আপনি এটি সুইচ-কেস ব্যবহার করতেও সেট করতে পারেন, তবে এটি যৌক্তিকভাবে একই ...
অ্যান্ড্রয়েড বিকাশকারী

3
আমারও তেমন সতর্কতা রয়েছে। তবে আমার দৃশ্যপট কিছুটা আলাদা কারণ যেহেতু আমি রিসাইকেলার ভিউ সেটআপ করার সময় একটি বেনাম অনটচলিস্টাইনার সেট করছি (myRecyclerView.setOnTouchListener কল করছি Android
fr4gus

8
যদি আমরা এই পদ্ধতি থেকে মিথ্যা ফিরে পাই, আমাদের কল করার দরকার performClickনেই, তাই না? এই ক্ষেত্রে আমি কেন বুঝতে পারছি না যে লিন্টের সতর্কতাটি এখনও রয়েছে
জিচাও ওয়াং

9
সতর্কতা ঠিক করতে কিছুই করে না।
TheLibrarian

2

আপনি লিন্ট দমন করতে পারেন

@SuppressLint("ClickableViewAccessibility")

আপনার performClick()ভিতরে কল করা উচিত onTouchEvent()

@Override
public boolean onTouchEvent(MotionEvent event) {
    //A logic 

    performClick();
    return super.onTouchEvent(event);
}

অথবা

findViewById(R.id.view1).setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {

        v.performClick();

        return v.onTouchEvent(event);
    }
});

OnTouch প্রবাহ

এখানে আরও পড়ুন


1
আপনাকে ওভাররাইড করতে হবে না performClick()। দয়া করে আপনার কোডটি ভাগ করুন
yoAlex5

1

আপনি যদি এমন কোনও ব্যবহার করছেন না Custom Viewযা স্পষ্টভাবে ওভাররাইড করেonPerformClick , সেক্কোর উত্তর অনুসরণ করে সতর্কতাটি সরানো হবে না।

তার উত্তর ছাড়াও, মত android.widget.Buttonবা ক্লাসে একই কাজ করার জন্যButton আপনাকে একটি সাধারণ কাস্টম ভিউ তৈরি করতে হবে যা লক্ষ্য দর্শনে প্রসারিত।

উদাহরণ:

কাস্টম ভিউ ক্লাস:

public class UselessButton extends AppCompatButton {
    public UselessButton(Context context) {
        super(context);
    }

    public UselessButton(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public UselessButton(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    @Override
    public boolean performClick() {
        return super.performClick();
    }
}

এক্সএমএল :

<stackoverflow.onEarth.UselessButton
    android:id="@+id/left"
    android:layout_width="60dp"
    android:layout_height="60dp"
    android:layout_marginStart="16dp"
    android:layout_marginTop="16dp"
    android:layout_marginEnd="8dp"
    android:layout_marginBottom="8dp"
    android:background="@drawable/left"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintHorizontal_bias="0.16"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent"
    app:layout_constraintBaseline_toBaselineOf="@+id/right"
    app:layout_constraintVertical_bias="0.5" />

জাভা :

    left.setOnTouchListener((v, event) -> {
        if (event.getAction() == MotionEvent.ACTION_DOWN) {
            enLeft = 1;
            enRight = 0;
            return true;
        } else if (event.getAction() == MotionEvent.ACTION_UP) {
            enLeft = 0;
            v.performClick();
            return false;
        } else {
            return false;
        }
    });

বর্তমান সমস্যাগুলি: সতর্কতা আইডিই দ্বারা সমাধান হয়ে যায়, তবে এটি বাস্তব অ্যান্ড্রয়েড ডিভাইসে কার্যকরভাবে ক্লিক ক্রিয়া দেখতে পাচ্ছে না can't

সম্পাদনা : ক্লিক ইভেন্টটি স্থির করে: ব্যবহার করুনView.setPressed(boolean)

down.setOnTouchListener((v, event) -> {
    if (event.getAction() == MotionEvent.ACTION_DOWN) {
        enFront = 0;
        enBack = 1;
        left.setPressed(true);
        return true;
    } else if (event.getAction() == MotionEvent.ACTION_UP) {
        enBack = 0;
        v.performClick();
        v.setPressed(false);
        return false;
    } else {
        return false;
    }

0

ঠিক এইভাবে পারফর্ম ক্লিকের পদ্ধতিটি কল করুন:

@Override
public boolean onTouch(View v, MotionEvent event) {
    v.performClick();
    Tools.hideKeyboard(getActivity(), getView());
    getView().clearFocus();
    return false;
}   

0

আমার একটি একই সমস্যা ছিল MultiTouchListenerএবং এটি কার্যকর করে GestureDetectorএবং এর জন্য শ্রোতার সমাধান করে SingleTap(এটি সতর্কতাটি সরিয়ে দেয় না তবে onClickআমার দৃশ্যে ইভেন্টগুলি ট্রিগার করতে শুরু করে )

class TouchListener(context: Context) : MultiTouchListener() {

    private var tochedView: View? = null
    private var mGestureDetector = CustomGestureDetector()
    private var gestureDetector: GestureDetector = GestureDetector(context, mGestureDetector)

    @SuppressLint("ClickableViewAccessibility")
    override fun onTouch(view: View?, event: MotionEvent?): Boolean {
        val aux = super.onTouch(view, event)

        tochedView = view
        gestureDetector.onTouchEvent(event)

        return aux
    }

    private inner class CustomGestureDetector: GestureDetector.SimpleOnGestureListener() {

        override fun onSingleTapUp(e: MotionEvent?): Boolean {
            // this will be called even when a double tap is
            tochedView?.performClick()
            return super.onSingleTapUp(e)
        }

        override fun onSingleTapConfirmed(e: MotionEvent?): Boolean {
            // this will only be called after the detector is confident that the
            // user's first tap is not followed by a second tap leading to a double-tap gesture.
            tochedView?.performClick()
            return super.onSingleTapConfirmed(e)
        }

    }

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