Pull to refresh

Простой Swipe-листенер. Не только для фрагментов

В процессе работы над модулем файлового проводника наткнулся на небольшую проблему: проводник работает на одном фрагменте, навигация «Назад» обрабатыватся в onBackPressed(), НО нужно добавить навигацию «Назад» при помощи свайпа вправо. Заминка в том что будь у меня изначально несколько фрагментов, дело решилось бы быстро при помощи ViewPager'a. Но у меня есть только одна Activity и один Fragment. Немного пораскинув остатками серого вещества был найден выход с ситуации — свайп-листенер для View.
Выглядит он как то так:

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());
    }


Не претендую на оригинальность и(или) уникальность, но надеюсь кому то эта вещь пригодится.
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.