คำเตือน onTouchListener: onTouch ควรเรียก View # performClick เมื่อตรวจพบการคลิก


109

ฉันได้สร้างไฟล์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

คำตอบ:


129

ได้แล้ว:

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

@longilong ถ้าคุณต้องการคุณสามารถตั้งค่าให้ใช้สวิตช์เคสได้ แต่ก็มีเหตุผลเหมือนกัน ...
พัฒนา android

3
ฉันมีคำเตือนที่คล้ายกัน แต่สถานการณ์ของฉันแตกต่างกันเล็กน้อยเนื่องจากฉันตั้งค่า OnTouchListener ที่ไม่ระบุชื่อเมื่อตั้งค่า RecyclerView (เรียก myRecyclerView.setOnTouchListener Android Studio กำลังทำเครื่องหมายคลาสที่ไม่ระบุชื่อทั้งหมดด้วยคำเตือนที่คล้ายกันและแม้ว่าฉันจะเพิ่ม v.performClick คำเตือนก็ยังคงอยู่
fr4gus

8
ถ้าเราคืนค่าเท็จจากวิธีนี้เราไม่จำเป็นต้องโทรperformClickใช่ไหม? ในกรณีนี้ฉันไม่เข้าใจว่าเหตุใดจึงยังคงมีคำเตือนผ้าสำลีอยู่
Jiechao Wang

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คำเตือนจะไม่ถูกลบออกเพียงทำตามคำตอบของ Secko

นอกเหนือจากคำตอบของเขาสำหรับการทำเช่นเดียวกันในชั้นเรียนเช่น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" />

Java :

    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

เพียงเรียกใช้วิธีการ performClick เช่นนี้:

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

0

ฉันมีปัญหาที่คล้ายกันกับ a MultiTouchListenerและแก้ไขได้โดยใช้ a GestureDetectorและฟังสำหรับ a 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.