onTouchListener चेतावनी: एक क्लिक का पता चलने पर onTouch को # प्रदर्शन देखें पर क्लिक करना चाहिए


108

मैंने बनाया है onTouchListener। दुर्भाग्य से onTouch () विधि 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()। कार्यान्वयन थोड़ी ध्वनि बजाएगा (यदि आपने इसे अपने डिवाइस पर सक्षम किया है) और onClickListener को कॉल करें, जिसे आपने संभवतः ओवरराइड नहीं किया है
Blackbelt

आपका उत्तर सही था। धन्यवाद
Trzy Gracje

जवाबों:


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
इसे केवल तभी नहीं कहा जाना चाहिए जब घटना == MotionEvent.Action_UP, या ऐसा कुछ हो? इसके अलावा, वास्तव में मूल क्लिकिंग पद्धति को "असत्य" नहीं कहेंगे, इसलिए आपको इसके बजाय वास्तव में "सही" लौटना चाहिए?
Android डेवलपर

@ लॉन्गिलॉन्ग अगर आप चाहें तो इसे स्विच-केस का उपयोग करने के लिए भी सेट कर सकते हैं, लेकिन यह तार्किक रूप से समान है ...
Android डेवलपर

3
मेरी भी ऐसी ही चेतावनी है। लेकिन मेरा परिदृश्य थोड़ा अलग है क्योंकि मैं RecyclerView (myRecyclerView.setOnTouchListener को कॉल करते समय) एक अनाम OnTouchListener की स्थापना कर रहा हूं। Android Studio एक समान चेतावनी के साथ पूरे अनाम वर्ग को चिह्नित कर रहा है और यहां तक ​​कि अगर मैं v.perform को जोड़ता हूं तो चेतावनी बनी रहती है।
fr4gus

8
यदि हम इस विधि से गलत लौटें, तो हमें कॉल करने की आवश्यकता नहीं होनी चाहिए performClick, है ना? इस मामले में मुझे समझ में नहीं आया कि लिंट चेतावनी अभी भी क्यों है
जेइचाहो वांग

9
चेतावनी को ठीक करने के लिए कुछ भी नहीं करता है।
लाइब्रेरियन

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();
    }
}

XML :

<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;
        }
    });

वर्तमान समस्याएं: चेतावनी IDE द्वारा हल हो जाती है, लेकिन वास्तविक Android डिवाइस पर इस व्यावहारिक रूप से प्रदर्शन क्लिक कार्रवाई नहीं देख सकता है।

संपादित करें : क्लिक इवेंट: फिक्स्ड हो रहा है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

इस तरह से सिर्फ callClick विधि को कॉल करें:

@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)
        }

    }

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