developer tip

onTouchListener 경고 : 클릭이 감지되면 onTouch가 View # performClick을 호출해야합니다.

optionbox 2020. 9. 8. 07:53
반응형

onTouchListener 경고 : 클릭이 감지되면 onTouch가 View # performClick을 호출해야합니다.


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

여기 있습니다 :

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

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 기기에서 실제로 수행되는 클릭 동작을 볼 수 없습니다.

EDIT: Fixed getting the click event : Use 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;
    }

You can suppress the Lint

@SuppressLint("ClickableViewAccessibility")

You should call performClick() inside onTouchEvent().

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

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

or

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

        v.performClick();

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

OnTouch flow

Read more here

참고URL : https://stackoverflow.com/questions/24952312/ontouchlistener-warning-ontouch-should-call-viewperformclick-when-a-click-is-d

반응형