onTouchListner()
버튼 에 추가하려고 하면
버튼에 setOnTouchListener가 호출되었지만 performClick을 재정의하지 않습니다.
경고. 누구든지 그것을 고치는 방법을 알고 있습니까?
btnleftclick.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
return false;
}
});
오류:
사용자 정의보기가 setOnTouchListener를 호출했지만 performClick을 재정의하지 않습니다. onTouchEvent를 재정의하거나 OnTouchListener를 사용하는보기가 performClick도 구현하지 않고 클릭이 감지 될 때 호출하면보기가 접근성 작업을 제대로 처리하지 못할 수 있습니다. 클릭 동작이 발생해야 할 때 일부 접근성 서비스가 performClick을 호출하므로 클릭 동작을 처리하는 로직은 View # performClick에 배치하는 것이 이상적입니다.
답변
이 경고는 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;
}
});
}
답변
해결책:
-
Button 또는 사용중인 뷰를 확장하는 클래스를 만들고 performClick ()을 재정의합니다.
class TouchableButton extends Button { @Override public boolean performClick() { // do what you want return true; } }
-
이제이 TouchableButton을 xml 및 / 또는 코드에서 사용하면 경고가 사라집니다!
답변
추가해 보셨나요?
view.performClick()
또는 억제 주석 추가 :
@SuppressLint("ClickableViewAccessibility")
?
답변
사용자 정의보기 제어에는 비표준 터치 이벤트 동작이 필요할 수 있습니다. 예를 들어 사용자 지정 컨트롤은 onTouchEvent (MotionEvent) 리스너 메서드를 사용하여 ACTION_DOWN 및 ACTION_UP 이벤트를 감지하고 특수 클릭 이벤트를 트리거 할 수 있습니다. 접근성 서비스와의 호환성을 유지하려면이 맞춤 클릭 이벤트를 처리하는 코드가 다음을 수행해야합니다.
해석 된 클릭 액션에 대한 적절한 AccessibilityEvent를 생성합니다. 터치 스크린을 사용할 수없는 사용자를 위해 사용자 지정 클릭 동작을 수행하려면 접근성 서비스를 활성화합니다. 이러한 요구 사항을 효율적으로 처리하려면 코드에서이 메서드의 슈퍼 구현을 호출 한 다음 click 이벤트에 필요한 모든 작업을 실행해야하는 performClick () 메서드를 재정의해야합니다. 사용자 지정 클릭 동작이 감지되면 해당 코드는 performClick () 메서드를 호출해야합니다.
https://developer.android.com/guide/topics/ui/accessibility/custom-views#custom-touch-events