web-dev-qa-db-ja.com

android ButtonにはsetOnTouchListenerが呼び出されていますが、performClickをオーバーライドしません。

ボタンにontouchListnerを追加しようとすると私になります

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

警告。誰でもそれを修正する方法を知っています。ありがとうございました..

1

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

エラー:

カスタムビューにsetOnTouchListenerが呼び出されますが、performClickはオーバーライドされませんonTouchEventをオーバーライドする、またはOnTouchListenerを使用するViewでもperformClickが実装されず、クリックが検出されたときに呼び出される一部のユーザー補助サービスはクリックアクションが発生したときにperformClickを呼び出すので、クリックアクションを処理するロジックは、理想的にはView#performClickに配置する必要があります。

62
kas

この警告が表示されるのは、Androidが、あなたのアプリを使用している可能性がある視覚障害者について考えるようにあなたに思い出させたいからです。その概要については、 this video をご覧になることをお勧めします。

標準の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に対してあなたが何をしたいのかわからない。もしあなたがカスタムボタンを作り、私がカスタムonTouchEventのために上で行ったようにTextViewperformClick()を呼んだとしたら、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;
        }
    });
}
59
Suragch

解決策:

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

    class TouchableButton extends Button {
    
        @Override
        public boolean performClick() {
            // do what you want
            return true;
        }
    }
    
  2. 今すぐxmlおよび/またはコードでこのTouchableButtonを使うと、警告は消えます!

12
Sjd

追加してみました:

view.performClick()

またはsuppresslintアノテーションを追加する:

@SuppressLint("ClickableViewAccessibility")

8
lambda