AndroidボタンにはsetOnTouchListenerが呼び出されていますが、performClickをオーバーライドしません


112

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に配置する必要があります。


カスタムビューでImageViewsetOnTouchListenerが呼び出されていますが、performClickをオーバーライドしていませんonTouchEventをオーバーライドするビューまたはOnTouchListenerを使用するビューもperformClickを実装せず、クリックが検出されたときにそれを呼び出す場合、ビューはアクセシビリティアクションを適切に処理しない可能性があります。一部のアクセシビリティサービスはクリックアクションが発生したときにperformClickを呼び出すため、クリックアクションを処理するロジックはView#performClickに配置するのが理想的です。
kas 2017年

ここに私の答えをご覧ください。stackoverflow.com/questions/47170075/...
ラムダ

回答:


133

この警告が表示されるのは、Androidが、アプリを使用している可能性のある視覚障害者を視覚的に認識させるためです。それがどのようなものかについての簡単な概要については、このビデオをご覧になることをお勧めします。

標準のUIビュー(のようなButtonTextViewなど)は、すべてのユーザー補助サービスを介して適切なフィードバックを持つ盲目のユーザーに提供するように設定されています。タッチイベントを自分で処理しようとすると、そのフィードバックを提供し忘れる危険があります。これが警告の目的です。

オプション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を使用しているカスタムビューの一部を再度作成することです。hahaha:Dとても奇妙です
Shan Xeeshi '27 / 08/27

19
これでグーグルが開発者がどれだけ時間を浪費しているのか理解できるのだろうか。つまり、API内でこれを処理できる可能性がありますか?ビューのサブクラス化に時間を費やしたり、警告を解決する方法を検索したりするだけでも、多くの時間が無駄になります。
TatiOverflow 2018年

メソッドでMotionEvent eventオブジェクトが必要な場合はどうなりますdoSomething()か?確認する必要がありevent.getY()ます。
マテウスゴンディム2018年

@MateusGondim、私はperformClick()まだ実装するのにまだあまり能力がないと言わざるを得ません。私の最初の考えは、event.getY()が実際のクリックイベント(つまり、視覚的なUI効果)に不可欠ではない場合、そのロジックをに戻しonTouchEvent()ます。それ以外の場合は、最後のアクションアップY値を格納するクラスメンバー変数を作成できます。また、いくつかの標準ビューのソースコードをチェックして、Androidによる実装方法を確認することもお勧めします。もっと自分で勉強する必要があります。
Suragch 2018年

1
@sisisisi、オーバーライドするときに警告が表示されますがonTouchEvent()、上書きされませんperformClick()。これには、スワイプ、クリック、またはキャプチャしようとしているその他のタッチイベントが含まれる場合があります。
Suragch、2018年

17

解決:

  1. Buttonまたは使用しているビューを拡張するクラスを作成し、performClick()をオーバーライドします。

    class TouchableButton extends Button {
    
        @Override
        public boolean performClick() {
            // do what you want
            return true;
        }
    }
    
  2. このTouchableButtonをxmlやコードで使用すると、警告は表示されなくなります。


18
これは本当にひどいです。既存のビューを使用する方法はありませんか?
ミルク

@ミルクノープ。android.widget.Buttonハードコード化されているため、これを行うことはできません。そして、それはAndroid開発チームから非常に意図的であるようです。
tom_mai78101

11

追加してみましたか:

view.performClick()

またはsuppresslintアノテーションを追加します。

@SuppressLint("ClickableViewAccessibility")


2
はい。Android Studio 3.0エディションでのこの警告の予告
kas

1
はい、その警告を修正する別の方法があります。参照してください。 stackoverflow.com/questions/47170075/...
ラムダ

1

カスタムビューコントロールでは、非標準のタッチイベント動作が必要になる場合があります。たとえば、カスタムコントロールは、onTouchEvent(MotionEvent)リスナーメソッドを使用してACTION_DOWNイベントとACTION_UPイベントを検出し、特別なクリックイベントをトリガーできます。アクセシビリティサービスとの互換性を維持するために、このカスタムクリックイベントを処理するコードは次のことを行う必要があります。

解釈されたクリックアクションに対して適切なAccessibilityEventを生成します。ユーザー補助サービスを有効にして、タッチスクリーンを使用できないユーザーに対してカスタムクリックアクションを実行します。これらの要件を効率的に処理するには、コードでperformClick()メソッドをオーバーライドする必要があります。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.