1. ホーム
  2. android

[解決済み] AndroidのボタンにsetOnTouchListenerが呼び出されているが、performClickがオーバーライドされていない

2022-04-27 16:28:14

質問

を追加しようとすると onTouchListner() をボタンに追加すると、次のようになります。

ボタンに setOnTouchListener が呼び出されたが、オーバーライドされていない performClick

の警告を表示します。どなたか修正方法をご存知でしょうか?

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

エラーです。

カスタムビューで setOnTouchListener が呼び出されているが、オーバーライドされていない。 performClick onTouchEventをオーバーライドするViewや、onTouchEventを使用するViewがある場合。 OnTouchListenerは、performClickも実装しておらず、以下の場合に呼び出されます。 クリックが検出されると、View はアクセシビリティ・アクションを処理しないことがあります。 を適切に行う必要があります。クリックアクションを処理するロジックは、理想的には アクセシビリティサービスの中には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 のため、毎回2回呼び出されることになります。 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;
        }
    });
}