ボタンにontouchListner
を追加しようとすると私になります
ボタンにsetOnTouchListenerが呼び出されていますが、performClickをオーバーライドしません。
警告。誰でもそれを修正する方法を知っています。ありがとうございました..
btnleftclick.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
return false;
}
});
エラー:
カスタムビューにsetOnTouchListenerが呼び出されますが、performClickはオーバーライドされませんonTouchEventをオーバーライドする、またはOnTouchListenerを使用するViewでもperformClickが実装されず、クリックが検出されたときに呼び出される一部のユーザー補助サービスはクリックアクションが発生したときにperformClickを呼び出すので、クリックアクションを処理するロジックは、理想的にはView#performClickに配置する必要があります。
この警告が表示されるのは、Androidが、あなたのアプリを使用している可能性がある視覚障害者について考えるようにあなたに思い出させたいからです。その概要については、 this video をご覧になることをお勧めします。
標準のUIビュー(Button
、TextView
など)はすべて、アクセシビリティサービスを通じて適切なフィードバックを盲目のユーザーに提供するように設定されています。自分でタッチイベントを処理しようとすると、そのフィードバックを忘れてしまう危険があります。これが警告の対象です。
タッチイベントの処理は通常カスタムビューで行われます。このオプションをすぐに無視しないでください。それほど難しいことではありません。これは、タッチイベントを処理するためにオーバーライドされた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"/>
カスタムビューの作成に関する詳細は 私の他の答え を参照してください。
それ以外の場合は、警告を黙らせるだけの方が良いかもしれません。例えば、私はあなたがタッチイベントを必要とするButton
に対してあなたが何をしたいのかわからない。もしあなたがカスタムボタンを作り、私がカスタムonTouchEvent
のために上で行ったようにTextView
でperformClick()
を呼んだとしたら、Button
はすでにperformClick()
を呼んでいるので、毎回二度呼ばれるでしょう。
警告を黙らせたい理由がいくつかあります。
警告を抑制するために、メソッドの先頭に次の行を追加します。
@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;
}
}
今すぐxmlおよび/またはコードでこのTouchableButtonを使うと、警告は消えます!
追加してみました:
view.performClick()
またはsuppresslintアノテーションを追加する:
@SuppressLint("ClickableViewAccessibility")
?