EditText を拡張し、対応する MotionEvents がいつ発生するかを確認するために onTouchEvent() メソッドを上書きするクラスがあります。
public class CustomEditText extends EditText {
public CustomEditText(Context context) {
super(context);
}
public CustomEditText(Context context, AttributeSet attrs) {
super(context, attrs);
}
public CustomEditText(Context context, AttributeSet attrs, int i) {
super(context, attrs, i);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
switch(event.getAction()) {
case MotionEvent.ACTION_DOWN: Log.v("ME", "down");
break;
case MotionEvent.ACTION_UP: Log.v("ME", "up");
break;
case MotionEvent.ACTION_MOVE: Log.v("ME", "move");
break;
case MotionEvent.ACTION_CANCEL: Log.v("ME", "cancel");
break;
}
return true;
}
}
View が 内にない場合ScrollView
、すべてが期待どおりに機能します。指が画面上を動き回っている限り、LogCat は "move" を出力します。しかし、View が a の内側にScrollView
あり、指を垂直に動かしている場合、LogCat は「移動」を出力し、数ミリメートル後に「キャンセル」を出力し、画面上で指を元に戻すまで何も出力しません。これは、水平に移動すると発生しません。
その理由は、この時点で、ScrollView
今すぐスクロールを開始する必要があることを認識し、その結果、View から MotionEvents を「盗んで」、それら自体を評価するためだと思います。
私の質問は次のとおりです。拡張する新しいクラスを作成せずに、この動作を禁止するにはどうすればよいScrollView
ですか?
楽しみにありがとう
ダニエル R.