В процессе работы над модулем файлового проводника наткнулся на небольшую проблему: проводник работает на одном фрагменте, навигация «Назад» обрабатыватся в onBackPressed(), НО нужно добавить навигацию «Назад» при помощи свайпа вправо. Заминка в том что будь у меня изначально несколько фрагментов, дело решилось бы быстро при помощи ViewPager'a. Но у меня есть только одна Activity и один Fragment. Немного пораскинув остатками серого вещества был найден выход с ситуации — свайп-листенер для View.
Выглядит он как то так:
FileChooserActivity.java
Ну а используется вот так:
FileListFragment.java
Не претендую на оригинальность и(или) уникальность, но надеюсь кому то эта вещь пригодится.
Выглядит он как то так:
FileChooserActivity.java
private GestureDetector gestureDetector;
View.OnTouchListener gestureListener;
public void setSwipeListener(View v) {
if (v == null)
return;
gestureDetector = new GestureDetector(this, new SwipeGestureDetector());
gestureListener = new View.OnTouchListener() {
public boolean onTouch(View v, MotionEvent event) {
return gestureDetector.onTouchEvent(event);
}
};
v.setOnTouchListener(gestureListener);
}
private void onLeftSwipe() {
}
private void onRightSwipe() {
onBackPressed();
}
private class SwipeGestureDetector extends SimpleOnGestureListener {
private static final int SWIPE_MIN_DISTANCE = 50;
private static final int SWIPE_MAX_OFF_PATH = 200;
private static final int SWIPE_THRESHOLD_VELOCITY = 200;
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
float velocityY) {
try {
float diffAbs = Math.abs(e1.getY() - e2.getY());
float diff = e1.getX() - e2.getX();
if (diffAbs > SWIPE_MAX_OFF_PATH)
return false;
// Left swipe
if (diff > SWIPE_MIN_DISTANCE
&& Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
onLeftSwipe();
}
// Right swipe
else if (-diff > SWIPE_MIN_DISTANCE
&& Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
onRightSwipe();
}
} catch (Exception e) {
// Log.e("Home", "Error on gestures");
}
return false;
}
}
Ну а используется вот так:
FileListFragment.java
@Override
public void onLoadFinished(Loader<List<File>> loader, List<File> data) {
mAdapter.setListItems(data);
if (isResumed())
setListShown(true);
else
setListShownNoAnimation(true);
getListView().setCacheColorHint(Color.TRANSPARENT);
getListView().setVerticalFadingEdgeEnabled(true);
getListView().setDivider(null);
getListView().setFastScrollEnabled(true);
getListView().setScrollBarStyle(View.SCROLLBARS_OUTSIDE_OVERLAY);
getListView().setSelector(new ColorDrawable(Color.TRANSPARENT));
((FileChooserActivity) getActivity()).setSwipeListener( getListView());
}
Не претендую на оригинальность и(или) уникальность, но надеюсь кому то эта вещь пригодится.