Android 버튼에 setOnTouchListener가 호출되었지만 performClick을 재정의하지 않습니다.


113

onTouchListner()버튼 에 추가하려고 하면

버튼에 setOnTouchListener가 호출되었지만 performClick을 재정의하지 않습니다.

경고. 누구든지 그것을 고치는 방법을 알고 있습니까?

1

btnleftclick.setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View view, MotionEvent motionEvent) {
        return false;
    }
});

오류:

사용자 정의보기가 setOnTouchListener를 호출했지만 performClick을 재정의하지 않습니다. onTouchEvent를 재정의하거나 OnTouchListener를 사용하는보기가 performClick도 구현하지 않고 클릭이 감지 될 때 호출하면보기가 접근성 작업을 제대로 처리하지 못할 수 있습니다. 클릭 동작이 발생해야 할 때 일부 접근성 서비스가 performClick을 호출하므로 클릭 동작을 처리하는 로직은 View # performClick에 배치하는 것이 이상적입니다.


사용자 정의보기 ImageView가 setOnTouchListener를 호출했지만 performClick을 재정의하지 않습니다. onTouchEvent를 재정의하거나 OnTouchListener를 사용하는보기가 performClick도 구현하지 않고 클릭이 감지 될 때 호출하면보기가 접근성 작업을 제대로 처리하지 못할 수 있습니다. 클릭 동작이 발생해야 할 때 일부 접근성 서비스가 performClick을 호출하므로 클릭 동작을 처리하는 로직은 View # performClick에 배치하는 것이 이상적입니다.
kas

여기에 내 대답을 참조하십시오 : stackoverflow.com/questions/47170075/…
lambda

답변:


134

이 경고는 Android가 앱을 사용하고있을 수있는 시각 장애인 또는 시각 장애인에 대해 생각하도록 상기 시키려고하기 때문에 표시됩니다. 그게 어떤 것인지에 대한 간략한 개요 를 보려면 이 비디오 를 시청하는 것이 좋습니다 .

표준 UI보기 (예 Button: TextView, 등)는 모두 시각 장애인에게 접근성 서비스를 통해 적절한 피드백을 제공하도록 설정되어 있습니다. 터치 이벤트를 직접 처리하려고하면 해당 피드백 제공을 잊어 버릴 위험이 있습니다. 이것이 경고의 목적입니다.

옵션 1 : 사용자 지정보기 만들기

터치 이벤트 처리는 일반적으로 사용자 정의보기에서 수행됩니다. 이 옵션을 너무 빨리 닫지 마십시오. 그렇게 어렵지 않습니다. 다음은 TextView터치 이벤트를 처리하기 위해 재정 의 된의 전체 예입니다 .

public class CustomTextView extends AppCompatTextView {

    public CustomTextView(Context context) {
        super(context);
    }

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

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        super.onTouchEvent(event);

        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                return true;

            case MotionEvent.ACTION_UP:
                performClick();
                return true;
        }
        return false;
    }

    // Because we call this from onTouchEvent, this code will be executed for both
    // normal touch events and for when the system calls this using Accessibility
    @Override
    public boolean performClick() {
        super.performClick();
        doSomething();
        return true;
    }

    private void doSomething() {
        Toast.makeText(getContext(), "did something", Toast.LENGTH_SHORT).show();
    }
}

그런 다음 다음과 같이 사용합니다.

<com.example.myapp.CustomTextView
    android:id="@+id/textview"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:padding="20dp"
    android:text="Click me to do something"/>

참조 내 다른 대답을 사용자 정의보기를 만드는 방법에 대한 자세한 내용은.

옵션 2 : 경고 음소거

다른 경우에는 경고를 침묵시키는 것이 더 나을 수도 있습니다. 예를 들어 Button터치 이벤트가 필요한으로 무엇을하고 싶은지 잘 모르겠습니다 . 사용자 정의 버튼을 만들 있었다라고하는 경우 performClick()onTouchEvent나는 정의를 위해 위처럼 TextView때문에, 그것은 두 번 할 때마다 호출되는 것이 Button이미 호출합니다 performClick().

경고를 무음으로 설정하려는 몇 가지 이유는 다음과 같습니다.

  • 터치 이벤트로 수행하는 작업은 시각적 일뿐입니다. 앱의 실제 작동에는 영향을주지 않습니다.
  • 당신은 냉정하고 맹인에게 세상을 더 나은 곳으로 만드는 데 관심이 없습니다.
  • 위의 옵션 1에서 제공 한 코드를 복사하여 붙여 넣기에는 너무 게으르다.

경고를 표시하지 않으려면 메소드 시작 부분에 다음 행을 추가하십시오.

@SuppressLint("ClickableViewAccessibility")

예를 들면 :

@SuppressLint("ClickableViewAccessibility")
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    Button myButton = findViewById(R.id.my_button);
    myButton.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View view, MotionEvent motionEvent) {
            return false;
        }
    });
}

1
다른 글꼴을 사용하기 때문에 customviews를 사용하고있었습니다. 이제 Api 26에서 새로운 기능이 도입되었으므로 xml의 글꼴과 이전 버전의 경우 Api 16까지 지원하는 지원 라이브러리 26을 사용합니다. 따라서 모든 사용자 지정보기를 제거했습니다. 그리고이 어리석은 경고가 나타나고 해결책은 내가 setOnTouchListener를 사용하고있는 일부 사용자 정의보기를 다시 만드는 것입니다. 하하하 : D 그래서 이상한
산 Xeeshi

19
구글이 이것으로 얼마나 많은 개발자 시간을 낭비하는지 알고 있는지 궁금합니다. 내 말은, 그들은 API 내에서 이것을 처리 할 수 ​​있습니까? 뷰를 하위 분류하거나 경고를 해결하는 방법을 검색하는 데 시간을 소비하는 것은 많은 시간을 낭비합니다.
TatiOverflow

메서드에 MotionEvent event개체 가 필요한 경우 어떻게해야 doSomething()합니까? 확인해야합니다 event.getY().
Mateus Gondim

@MateusGondim, performClick()아직 구현에 능숙하지 않다고 말해야합니다 . 내 초기 생각은 이것이 event.getY()실제 클릭 이벤트 (예 : 시각적 UI 효과)에 필수적이지 않은 경우 해당 논리를 onTouchEvent(). 그렇지 않으면 마지막 동작 Y값 을 저장하기 위해 클래스 멤버 변수를 만들 수 있습니다 . 또한 몇 가지 표준보기에 대한 소스 코드를 확인하여 Android가이를 구현하는 방법을 확인하는 것이 좋습니다. 더 많이 공부해야 해요.
Suragch

1
@sisisisi, 무시하면 경고가 표시 onTouchEvent()되지만 performClick(). 여기에는 스 와이프, 클릭 또는 캡처하려는 기타 터치 이벤트가 포함될 수 있습니다.
Suragch

17

해결책:

  1. Button 또는 사용중인 뷰를 확장하는 클래스를 만들고 performClick ()을 재정의합니다.

    class TouchableButton extends Button {
    
        @Override
        public boolean performClick() {
            // do what you want
            return true;
        }
    }
  2. 이제이 TouchableButton을 xml 및 / 또는 코드에서 사용하면 경고가 사라집니다!


18
이건 정말 역겨워 요. 기존 뷰를 사용할 방법이 없습니까?
Milk

@Milk Nope. android.widget.Button하드 코딩되어 있으므로이를 허용하지 않습니다. 그리고 그것은 안드로이드 개발팀에서 매우 의도적 인 것 같습니다.
tom_mai78101

11

추가해 보셨나요?

view.performClick()

또는 억제 주석 추가 :

@SuppressLint("ClickableViewAccessibility")

?


2
예. 안드로이드 스튜디오 3.0 에디션이 포함 된이 경고의 등장
kas

1
알겠습니다. 경고를 수정할 대안이 있습니다. 참조하십시오 : stackoverflow.com/questions/47170075/…
lambda

1

사용자 정의보기 제어에는 비표준 터치 이벤트 동작이 필요할 수 있습니다. 예를 들어 사용자 지정 컨트롤은 onTouchEvent (MotionEvent) 리스너 메서드를 사용하여 ACTION_DOWN 및 ACTION_UP 이벤트를 감지하고 특수 클릭 이벤트를 트리거 할 수 있습니다. 접근성 서비스와의 호환성을 유지하려면이 맞춤 클릭 이벤트를 처리하는 코드가 다음을 수행해야합니다.

해석 된 클릭 액션에 대한 적절한 AccessibilityEvent를 생성합니다. 터치 스크린을 사용할 수없는 사용자를 위해 사용자 지정 클릭 동작을 수행하려면 접근성 서비스를 활성화합니다. 이러한 요구 사항을 효율적으로 처리하려면 코드에서이 메서드의 슈퍼 구현을 호출 한 다음 click 이벤트에 필요한 모든 작업을 실행해야하는 performClick () 메서드를 재정의해야합니다. 사용자 지정 클릭 동작이 감지되면 해당 코드는 performClick () 메서드를 호출해야합니다.

https://developer.android.com/guide/topics/ui/accessibility/custom-views#custom-touch-events

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.