この警告が表示されるのは、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;
}
});
}
ImageView
setOnTouchListenerが呼び出されていますが、performClickをオーバーライドしていませんonTouchEventをオーバーライドするビューまたはOnTouchListenerを使用するビューもperformClickを実装せず、クリックが検出されたときにそれを呼び出す場合、ビューはアクセシビリティアクションを適切に処理しない可能性があります。一部のアクセシビリティサービスはクリックアクションが発生したときにperformClickを呼び出すため、クリックアクションを処理するロジックはView#performClickに配置するのが理想的です。