#android #listview #ontouchlistener
#Android #listview #ontouchlistener
Вопрос:
У меня ситуация, когда у меня есть ViewPager, содержащий 3 фрагмента списка. Конечно, каждый ListFragment содержит ListView. У меня есть пользовательский макет для элементов. Чего я хотел бы добиться, так это того, что когда я нажимаю и удерживаю элемент, новый фрагмент начинается с анимации поверх текущего. Я хотел бы остановить анимацию (удалить фрагмент), как только пользователь отпустит элемент. Я реализовал это как onTouchListner (код ниже). Проблема в том, что пока я нажимаю элемент, я могу прокручивать список. Я хотел бы предотвратить это.
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction() amp; MotionEvent.ACTION_MASK) {
case MotionEvent.ACTION_DOWN:
touchDownTime = event.getDownTime();
mDownX = event.getX();
mDownY = event.getY();
isOnClick = true;
break;
case MotionEvent.ACTION_CANCEL:
case MotionEvent.ACTION_UP:
if (isOnClick
amp;amp; fragment
.isAnimation()) {
if (!fragment.isReleased()) {
fragment
.cancelAnimation();
} else {
fragment
.startReleaseAnimation();
}
}
break;
case MotionEvent.ACTION_MOVE:
if (isOnClick
amp;amp; !fragment
.isAnimation()
amp;amp; (Math.abs(mDownX - event.getX()) > SCROLL_THRESHOLD || Math
.abs(mDownY - event.getY()) > SCROLL_THRESHOLD)) {
isOnClick = false;
} else if (event.getEventTime() - touchDownTime > 150
amp;amp; !fragment
.isAnimation()) {
FragmentTransaction transaction = fragmentManager.beginTransaction();
transaction
.add(R.id.container,
fragment)
.addToBackStack(null).commit();
}
break;
default:
break;
}
return true;
}
});
Ответ №1:
Вы должны попробовать requestDisallowInterceptTouchEvent
Это предотвратит перехват событий касания
попробуйте это
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction() amp; MotionEvent.ACTION_MASK) {
case MotionEvent.ACTION_DOWN:
getParent().requestDisallowInterceptTouchEvent(true);
// Your code
break;
case MotionEvent.ACTION_CANCEL:
case MotionEvent.ACTION_UP:
getParent().requestDisallowInterceptTouchEvent(false);
// Your code
break;
default:
break;
}
return true;
}
});