Intereting Posts
Android – при выходе из WebView звук все еще продолжает воспроизводиться Изменение цвета значка FAB на основе состояния w / compat libs Нужно отображать экран загрузки, пока сервер запросов приложений Приложение не будет выполняться на новом Android Studio 2.2 с градиентом 2.14.1 с включенным Instant Run Java.net.ConnectException: не удалось подключиться к localhost / 127.0.0.1 (порт 9090): соединение не выполнено: ECONNREFUSED (соединение отклонено) Любой API в android для нормализации номера телефона Volley Bug: повторение запроса при включении подробного ведения журнала Как подписать APK на Android Studio даже с непереведенными строками? Android: макет ListView xml не отображает фоновое изображение при прокрутке Сделать диалоговое окно предупреждений прозрачным Сделать веб-просмотр в планшете симулировать небольшое устройство Как установить onContextItemClickListener для контекстного меню ListView? Как показать двойную форму в качестве цены в текстовом виде в android Android одновременная загрузка и распаковка Имитировать решение для Security Alert – небезопасная реализация X509TrustManager

Android Fragment onCreateView с жесты

Я пытаюсь использовать Жесты внутри фрагмента; У меня есть внутри FragmentActivity, который обрабатывает фрагмент моих деталей. То, что я пытаюсь совершить, – это когда в представлении обнаружено совпадение, чтобы заменить данные внутри этого представления предыдущей или следующей записью.

Если есть лучший способ справиться с этим; Я полностью за. Однако здесь происходит то, что метод onFling никогда не называется.

public static class DetailsFragment extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { if (container == null) { return null; } View v = inflater.inflate(R.layout.my_view, null, false); final GestureDetector gesture = new GestureDetector(getActivity(), new GestureDetector.SimpleOnGestureListener() { @Override public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { final int SWIPE_MIN_DISTANCE = 120; final int SWIPE_MAX_OFF_PATH = 250; final int SWIPE_THRESHOLD_VELOCITY = 200; try { if (Math.abs(e1.getY() - e2.getY()) > SWIPE_MAX_OFF_PATH) return false; if (e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { Log.i(Constants.APP_TAG, "Right to Left"); } else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { Log.i(Constants.APP_TAG, "Left to Right"); titles.showDetails(getPosition() - 1); } } catch (Exception e) { // nothing } return super.onFling(e1, e2, velocityX, velocityY); } }); v.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { return gesture.onTouchEvent(event); } }); return v; } } 

Похоже, следующая проблема объясняет это: Android: GestureDetector не поймает жесты

Кроме того, вот результат:

На самом деле решение состоит в том, чтобы переопределить метод onDown и вернуть true; Иначе детектор жестов остановится и не обнаружит вверх:

  final GestureDetector gesture = new GestureDetector(getActivity(), new GestureDetector.SimpleOnGestureListener() { @Override public boolean onDown(MotionEvent e) { return true; } @Override public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { Log.i(Constants.APP_TAG, "onFling has been called!"); final int SWIPE_MIN_DISTANCE = 120; final int SWIPE_MAX_OFF_PATH = 250; final int SWIPE_THRESHOLD_VELOCITY = 200; try { if (Math.abs(e1.getY() - e2.getY()) > SWIPE_MAX_OFF_PATH) return false; if (e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { Log.i(Constants.APP_TAG, "Right to Left"); } else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { Log.i(Constants.APP_TAG, "Left to Right"); } } catch (Exception e) { // nothing } return super.onFling(e1, e2, velocityX, velocityY); } }); v.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { return gesture.onTouchEvent(event); } }); 

Пара комментариев

  1. Мне пришлось настроить мой код следующим образом:

     v.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { // return gesture.onTouchEvent(event); gesture.onTouchEvent(event); return true; // <-- this line made the difference } }); 
  2. Кроме того, если вы используете xml-файл для создания вашего представления

     View v = inflater.inflate(R.layout.my_view, null, false); 

Убедитесь, что вы на самом деле нажали предполагаемый вид. Хороший способ преувеличить тест состоит в том, чтобы сделать ширину и высоту «match_parent» вместо «wrap_content» в вашем XML-файле макета.