6

Я нашел вопрос ниже: Android: FragmentActivity in FragmentActivity (Scrollview in Navigationbar) . Однако этот вопрос связан с тем, как использовать транзакции для отображения фрагментов, а также для безопасного обнаружения жестов. Примечание. В ответе, который я опубликовал, есть ссылка, в которой также есть эффективный способ отображения фрагментов в контейнере с использованием транзакций, включая два сценария). Пожалуйста, см. Это. Я попробовал несколько вещей, в отношении, но с использованием фрагмента с поддержкой ViewPager, не вложенными:Полоса прокрутки, применяемая на уровне фрагмента вместе с ViewPager, по умолчанию не используется.

Детали: https://moqups.com/[email protected]/lc0ZOERO/p:a5d7b55eb

  1. по умолчанию Disabled салфетки с помощью onTouchEvent и onInterceptTouchEvent с помощью пользовательского ViewPager.
  2. Объявленный FragmentStatePagerAdapter со списком фрагментов, каждый из которых отображается на каждой вкладке.
  3. Объявите фрагменты в main_layout main_activity, у которого есть этот ViewPager вместе. Идея состоит в том, чтобы показать активность_фрагментов при нажатии кнопки на клике ViewPager_fragment и при нажатии пользователем кнопки , то по умолчанию ViewPager_fragment по умолчанию отображается снова, используя транзакции back stack для добавления и выталкивания их на BackPressed активности. Поэтому я также поддерживаю свой собственный backStack, чтобы показать/скрыть действия_фрагменты, когда задний стек выдает транзакцию.

Теперь то, что я хочу достичь, - это сделать третий пункт выше, используя жестовые салфетки для правых (слева направо) пальцев.

Я использовал GestureListener и SimpleOnGestureListener и активность OnTouchEvent для этого.

Проблема, что я лицо, что:

Этот жест работает на части экрана деятельности, которая ниже фрагмента и части деятельности. Я хочу, чтобы жест работал

  1. На участке фрагмента, который имеет несколько видов в своем расположении.
  2. В левом-правом направлении.
  3. Только от Activity_fragment до фрагмента вкладки ViewPager, чтобы вести себя как навигацию по истории, как это уже делалось в onBakPressed/onKeyDown с использованием всплывающих окон back-back и моего пользовательского back-стека.

Я пробовал следующий класс и изменял свой фрагмент активности в макетах, подобных этому.

Мой Жест и сенсорный слушатель расширен макет кадра:

 public class OnSwipeTouchListener extends FrameLayout { 

     private final GestureDetector gestureDetector; 
     private static final String TAG = "OnSwipeTouchListener"; 
    private Context context; 
     public OnSwipeTouchListener(Context context, AttributeSet attrs) { 
      super(context, attrs); 
      this.context=context; 
      gestureDetector = new GestureDetector(context, new GestureListener()); 
      setClickable(true); 

     } 

     @Override 
     public boolean onInterceptTouchEvent(MotionEvent ev) { 
      return super.onInterceptTouchEvent(ev); 
     } 

     @Override 
     public boolean onTouchEvent(MotionEvent event) { 
gestureDetector.onTouchEvent(motionEvent); 
      return super.onTouchEvent(event); 
     } 


     private final class GestureListener extends SimpleOnGestureListener { 

      private static final int SWIPE_THRESHOLD = 100; 
      private static final int SWIPE_VELOCITY_THRESHOLD = 100; 

      @Override 
      public boolean onDown(MotionEvent e) { 

       return true; 
      } 

      @Override 
      public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { 

       boolean result = false; 
       try { 
        float diffY = e2.getY() - e1.getY(); 
        float diffX = e2.getX() - e1.getX(); 
        if (Math.abs(diffX) > Math.abs(diffY)) { 
         if (Math.abs(diffX) > SWIPE_THRESHOLD && Math.abs(velocityX) > SWIPE_VELOCITY_THRESHOLD) { 
          if (diffX > 0) { 
           onSwipeRight(); 
          } else { 
           onSwipeLeft(); 
          } 
         } 
        } else { 
         if (Math.abs(diffY) > SWIPE_THRESHOLD && Math.abs(velocityY) >   SWIPE_VELOCITY_THRESHOLD) { 
          if (diffY > 0) { 
           onSwipeBottom(); 
          } else { 
           onSwipeTop(); 
          } 
         } 
        } 
       } catch (Exception exception) { 
        //see that e1 is null 
       } 
       return result; 
      } 
     } 

     public void onSwipeRight() { 
      ///manage my back stack history here. 
     } 

     public void onSwipeLeft() { 
     } 

     public void onSwipeTop() { 
     } 

     public void onSwipeBottom() { 
     } 
    } 

, а затем изменить макеты кадров в этом классе справки:

<path.to.my.package.OnSwipeTouchListener 
      android:id="@+id/activity_frag_frame_layout1" 
      android:layout_width="fill_parent" 
      android:layout_height="fill_parent" 
      android:visibility="invisible" > 

      <fragment 
       android:id="@+id/activity_frag1" 
       android:layout_width="fill_parent" 
       android:layout_height="fill_parent" 
       class="path.to.my.package.fragments.Activity_Frag1" 
       android:tag="act_frag1" /> 
     </path.to.my.package.OnSwipeTouchListener> 

Это немного помогло мне, поэтому она должна помочь вам в поиске решение. В одном из фрагментов, которые перестали работать, есть searchView, и щелчок не работает. Если вы понимаете, чего я хочу достичь, пожалуйста, помогите в этом отношении.

Обновление 1: Возвращение true как в onTouchEvent, так и onInterceptTouchEvent имеет желаемый эффект, но блокирует щелчки фрагментами, в которых находится SearchView, в доступных кликах нет кликов. Работает только салфетка. Обновление: в моем последнем: я также полностью отказался от использования транзакционных обратных стеков, потому что я полагаюсь на свой пользовательский back-stack, где я поддерживаю историю навигации для всех вкладок. Это я использую с помощью методов setCurrentTab и onTabSelected, заданных ViewPager и FragmentStatePagerAdapter.

Update 2: Это один трудно осуществить: Проверьте, какие нужны события, которые будут перехвачены и которые должны быть переданы на мнения детей: http://developer.android.com/training/gestures/viewgroup.html

Update 3:

  1. В мой макет для активности, есть пейджер представления, а в каждом макете фрейма ниже него есть один фрагмент.

  2. При запуске приложения viewPager показывает фрагмент на первой вкладке.

  3. Когда нажата кнопка на этом фрагменте, отображается один из фрагментов в рамке ниже viewpager и добавляется в пользовательскую заднюю часть.

  4. При нажатии клавиши возврата этот фрагмент снова скрывается, чтобы показать фрагмент вкладки в viewPager. Все вышеизложенное сделано. Только я хочу, чтобы жестом ладоней был слева направо на работу, и я обнаружил, что могу это сделать, перехватывая события касания. Но это совсем не так. Когда я возвращаю true, работает только с жестом салфетки, другое мудрый это действие отменено и щелчки на этом фрагменте работы.

+0

Вопрос не ясен. –

+0

@AliImran Разъяснение: что делать, если вы хотите больше фрагментов, кроме фрагментов вкладки (которые вы показываете на вкладках), потому что, когда вы нажимаете на кнопку на этом фрагменте, вы хотите показать другой фрагмент, а не новый вид деятельности, потому что вы хотите, чтобы вкладки и панель действий отображались и заставляли пользователя чувствовать, что этот новый фрагмент был открыт на той же вкладке, где он будет занимать то же место, что и фрагмент табуляции. Вот что я пытался сделать. Но теперь я хочу использовать салфетки, как описано выше. –

+1

Я думаю, что вы хотите это: -https: //github.com/astuetz/ViewPagerExtensions –

ответ

0

Я упомянул об этом в http://mobi-app-dev.blogspot.in/2014/01/android-transactions.html.

Check, который должен быть перехвачены события и которые должны быть переданы на мнения детей: http://developer.android.com/training/gestures/viewgroup.html

Вместо того, чтобы использовать мой салфетки жест слушателя в кадре верстки на , которые прилагаются фрагменты, Сейчас я использую это на относительных макетах, которые являются корневыми видами фрагментов .

@Override 
    public boolean onInterceptTouchEvent(MotionEvent event) { 
     boolean intercepted = super.onInterceptTouchEvent(event); 

     // In general, we don't want to intercept touch events. They should be 
     // handled by the child view. 

     gestureDetector.onTouchEvent(event); 
     return false; 
    } 

    @Override 
    public boolean onTouchEvent(MotionEvent event) { 
     boolean touched = super.onTouchEvent(event); 
     gestureDetector.onTouchEvent(event); 
     return touched; 
    } 

Вот некоторые советы, которые я теперь следовать при использовании фрагментов в моей деятельности:

Эффективное управление сделок по фрагменту:

[Примечание: В случае, если вы используете FragmentStatePagerAdapter, вы можете играть с заменой фрагмента другим фрагментом на определенный индекс в списке фрагмента, который вы используете в качестве данных для этого адаптера, таким образом, что вы находитесь на одной и той же вкладке, но его содержимое изменяется без изменения вкладки. Затем используйте notifyDataSetChanged(). Здесь вы не используете транзакции, но в противном случае вы делаете].

  1. Использовать Fragment.instantiate() для инициализации ваших фрагментов вместо конструктора.
  2. Используйте прослушиватели для обновления/удаления ссылки экземпляра (из коллекции, используемой для их ссылки) фрагмента onCreateView и onDestroy.
  3. Используйте getView(), чтобы получить корневой вид фрагмента каждый раз, когда и при обновлении .
  4. Не отслеживайте экземпляры, infact избегает статических указателей, где это возможно.
  5. Используйте getSupportFragment вместо ссылки на FragmentManager в виде пейджера-адаптера или в другом месте.
  6. Использовать прикрепление отладки при транзакции скрыть представление, чтобы избавиться от дочерних просмотров на Корневой вид фрагмента и повторная инициализация. Это потому, что только один фрагмент должен быть видимым за раз, остальные нужно отсоединить. Поэтому повторно присоединитесь по требованию.
  7. getActivity() или getApplicationContext() независимо от того, что применимо, вместо того, чтобы хранить глобальную переменную для сохранения ссылок на контекст.
  8. onConfiguration change (ориентация, клавиатура, изменение размера): делать в действии и передавать активному фрагменту, который его управляет. Важно: если вы хотите использовать фрагменты для транзакций, не объявляйте их в макетах. Предоставить идентификатор контейнера (макета) в транзакции добавления фрагмента.
  9. Операция фрагмента должна выполняться в случае вызова, а не где-либо еще, , и такое событие не должно повторяться. Это предотвращает исключение незаконного аргумента.
  10. Существует метод ViewPager, где вам не нужно использовать Fragments.Instead, , вы можете использовать Views или ViewGroups. Это заменяет вложенность фрагментов.
  11. Определите уровень фрагментов, это означает, что если вы хотите, чтобы фрагмент «B» заменил существующий фрагмент «A», и когда вы хотите вернуться к фрагменту «A», когда нажимаете «B», транзакция в фоновом режиме.

Совет: Carefull при добавлении функции салфетки, потому что есть и другие интерактивные виды. Проведите пальцем по перехвату прикосновением к RootView, возвращая false, но анализируя прикосновения.


еще одно: вы должны заметить, что наличие одного фрагмента в одном контейнере, в то время решает другую проблему: Если есть два фрагмента, один на вершине других, щелчки от одного фрагмента переходит к другой фрагмент, который ниже. Так что скройте или замените, чтобы иметь только один фрагмент за раз. Back-Stack помогает в поддержании уровней навигации, а также при изменении конфигурации или обновлении, попробуйте обновить один и тот же экземпляр целевого активного фрагмента, а не делать транзакции, потому что это изменяет порядок перемещения фрагментов.

 Смежные вопросы

  • Нет связанных вопросов^_^