Intereting Posts
C: \ Program Files \ MSBuid \ Novell \ Novell.MOnoDroid.Csharp.targets не найден Android AlertDialog Single Button Как установить фон формы в xml? Монетный двор: ошибка установки genymotion Stackoverflow: вызвано вложенными представлениями? Разница между макетом и макетом Как определить, использует ли устройство 12 или 24-часовой формат времени? Xamarin.Android Projects не удалось развернуть в visual studio эмулятор для Android Android: Как установить содержимое Редактировать текст с помощью кнопки? Как можно ограничить ввод EditText специальным символом, таким как обратная косая черта (/), tild (~) и т. Д. С помощью программной клавиатуры в программном обеспечении Android Как отправить сообщение из приложения Android через сообщение Viber Установить град для использования в кордове buildroid Сохранять данные в методе onDestroy Экран приложения Android и Pattern Lock Как сохранить и повторно использовать один и тот же экземпляр фрагментов?

Скольжение между фрагментами

Я разрабатываю приложение, и в настоящее время я пытаюсь добавить к нему ScreenSlide . Мне удалось сделать это с помощью учебника , но обычное скольжение между страницами x не совсем то, что я ищу.

С приведенным ниже кодом я могу перемещаться между 5 страницами, но страницы выровнены по прямой, и вы не можете перейти с первой страницы прямо на 5-ю и наоборот. В моем приложении у меня 4 страницы. Когда я сдвигаюсь влево, я переключаюсь между первыми 2 страницами, когда я двигаюсь вправо, я переключаюсь между двумя последними страницами. На изображении ниже вы можете увидеть, как мой текущий код переключает страницу и под ней – моя цель.

Введите описание изображения здесь

  public class MainActivity extends FragmentActivity { private static final int NUM_PAGES = 5; private ViewPager mPager; private ScreenSlidePageFragment[] pages = new ScreenSlidePageFragment[NUM_PAGES]; private PagerAdapter mPagerAdapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_screen_slide); mPager = (ViewPager) findViewById(R.id.pager); mPagerAdapter = new ScreenSlidePagerAdapter(getSupportFragmentManager()); mPager.setAdapter(mPagerAdapter); } @Override public void onBackPressed() { if (mPager.getCurrentItem() == 0) { super.onBackPressed(); } else { mPager.setCurrentItem(mPager.getCurrentItem() - 1); } } private class ScreenSlidePagerAdapter extends FragmentStatePagerAdapter { public ScreenSlidePagerAdapter(FragmentManager fm) { super(fm); } @Override public int getCount() { return NUM_PAGES; } @Override public Fragment getItem(int position) { boolean moveRight = mPager.getCurrentItem() < position; boolean moveLeft = mPager.getCurrentItem() > position; switch(position){ case 5: if(moveRight){ return geLog.w("i" + "Info", Integer.toString(position)); //return getPageByPosition(2); if(moveLeft) return getPageByPosition(2); } return new ScreenSlidePageFragment(); } private Fragment getPageByPosition(int position){ int index = position - 1; if(index < 0 || index > NUM_PAGES-1) throw new InvalidParameterException("requested position is invalid"); if(pages[index] == null) pages[index] = new ScreenSlidePageFragment(); return pages[index]; } } } 

[ОБНОВИТЬ]

Мне удалось написать код, который позволяет мне бесконечно скользить вправо между 6 различными страницами. Левая сторона ограничена, хотя я могу скользить только на первую страницу (так что, если я на первой странице после того, как я три раза вправо, я могу сделать только 3 цикла назад). Я думаю, что я очень близок к поиску решения. Есть идеи?

MainActivity.java

  public class MainActivity extends FragmentActivity { private static final int NUM_PAGES = 6; private ViewPager pager; private PagerAdapter pagerAdapter; private List<ScreenSlidePageFragment> slideList; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); slideList = new ArrayList<ScreenSlidePageFragment>(); for (int i = 0; i<NUM_PAGES; i++){ ScreenSlidePageFragment slide = new ScreenSlidePageFragment(); slide.setIndex(i+1); slideList.add(slide); } pager = (ViewPager) findViewById(R.id.pager); pagerAdapter = new ScreenSlidePagerAdapter(getSupportFragmentManager()); pager.setAdapter(pagerAdapter); } private class ScreenSlidePagerAdapter extends FragmentStatePagerAdapter { public ScreenSlidePagerAdapter(FragmentManager fm) { super(fm); } @Override public Fragment getItem(int position) { int _pos = position % NUM_PAGES; return slideList.get(_pos); } @Override public int getCount() { return Integer.MAX_VALUE; } } } 

ScreenSlidePageFragment.java

  public class ScreenSlidePageFragment extends Fragment { private int index; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { ViewGroup root = (ViewGroup)inflater.inflate(R.layout.slide, container, false); TextView tw = (TextView) root.findViewById(R.id.textView); tw.setText(Integer.toString(index)); return root; } public void setIndex(int index){ this.index = index; } } 

Solutions Collecting From Web of "Скольжение между фрагментами"

Один из возможных способов обхода – не использовать viewpager, но создавая собственный пользовательский слайдер, я оказался в этом решении, поскольку ViewPager очень негибкий, например, если вы пытаетесь сделать что-то вроде Facebook-приложения. Минусы: вам нужно управлять всеми касаниями и жизненным циклом.

Еще одно более простое решение для этого – в основном использовать следующий API, если я правильно понял вопрос, этого должно быть достаточно. ViewPager.setCurrentItem

Это то, что я сделал бы.

Поскольку у вас есть ограниченное количество экранов, я бы сделал массив, чтобы сохранить каждый экземпляр ScreenSlidePageFragment вы делаете под соответствующим индексом. Таким образом, вы можете получить экземпляр из этого массива с помощью «position». Это позволит вам использовать функцию getItem чтобы сделать что-то вроде

 ... private ScreenSlidePageFragment[] pages = new ScreenSlidePageFragment[NUM_PAGES]; ... @Override public Fragment getItem(int position) { boolean moveRight = mPager.getCurrentItem() < position; switch(position){ case 1: if(moveRight) return getPageByPosition(3); return getPageByPosition(2); case 2: if(moveRight) //case when you are in a position 3 and swipe right - return first screen return getPageByPosition(3); //if you're swiping left from position 1, return the next screen return getPageByPosition(1); case 3: //write out the rest of your logic ... } } private Fragment getPageByPosition(int position){ int index = position - 1; if(index < 0 || index > NUM_PAGES-1) throw new InvalidParameterException("requested position is invalid") if(pages[index] == null) pages[index] = new ScreenSlidePageFragment(); return pages[index]; } 

Примечание: код не проверен

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

Вы можете попробовать ViewPager.setCurrentItem

Если вы хотите перейти на страницу

 viewPager.setCurrentItem(PAGE_POS); 

Если вы хотите перейти на страницу без плавного прокрутки

 viewPager.setCurrentItem(PAGE_POS,false); 

Я думаю, что это возможно. 1. Установите количество элементов ViewPager в Integer.MAX_VALUE и текущий элемент в Integer.MAX_VALUE / 2. Это дает вам возможность создавать поддельные бесконечные прокрутки. 2. Реализуйте свою логику в зависимости от фрагмента в текущей позиции. Легко хранить их в адаптере:

  @Override public Fragment getItem(int position) { ItemFragmentRoot fragment = new ItemFragmentRoot(); mFragmentMap.put(position, fragment); return fragment; } @Override public void destroyItem(ViewGroup container, int position, Object object) { super.destroyItem(container, position, object); mFragmentMap.remove(position); } public ItemFragmentRoot getItem(int position){ return mFragmentMap.get(position); } 
  1. И самая сложная часть, я думаю. Поскольку кеш ViewPager не менее 1 просматривает каждую сторону, и вы не знаете, каким образом пользователь будет прокручивать единственный способ – это вручную инициализировать и повторно инициализировать появляющийся фрагмент в соответствии со стороной прокрутки. Используйте вложенный фрагмент внутри каждого ItemFragmentRoot, о котором я упоминал ранее. Все зависит от того, насколько сильно ваша иерархия просмотров.

Я могу написать больше кода позже, если вам нужно.

Следуйте этому руководству, это лучшее, я использовал его в своем приложении. Android Sliding Tabs с материальным дизайном