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 2014

당신의 대답은 정확했습니다. 주셔서 감사합니다
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
event == MotionEvent.Action_UP 또는 이와 유사한 경우에만 호출되어야하지 않습니까? 또한 "false"를 반환하면 원래 클릭 메서드가 실제로 호출되지 않으므로 대신 실제로 "true"를 반환해야합니까?
안드로이드 개발자

@longilong 그럼 당신은 당신이 또한 스위치 케이스를 사용하도록 설정할 수 있습니다 원하는 경우,하지만 논리적으로 같은 ...이다
안드로이드 개발자

3
비슷한 경고가 있습니다. 하지만 내 시나리오는 RecyclerView를 설정할 때 익명 OnTouchListener를 설정하기 때문에 약간 다릅니다 (myRecyclerView.setOnTouchListener 호출). Android Studio는 전체 익명 클래스에 유사한 경고를 표시하고 v.performClick을 추가해도 경고가 남아 있습니다.
fr4gus

8
이 메서드에서 false를 반환하면을 호출 할 필요가 없습니다 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명시 적으로 재정의 하는 을 사용하지 않는 경우 onPerformClickSecko의 대답을 따르는 것만으로 경고가 제거되지 않습니다.

그의 대답뿐만 아니라, 같은 클래스에서 같은 일을 위해 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

다음과 같이 performClick 메서드를 호출하면됩니다.

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

0

나는 a와 비슷한 문제가 있었고 a를 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.