В настоящее время одним из самых популярных виджетов в библиотеке Android является ViewPager. Он реализован в нескольких наиболее часто используемых приложениях Android, таких как приложение Google Play и одно из моих собственных приложений RBRecorder :
ViewPager — это виджет, который позволяет пользователю проводить пальцем влево или вправо, чтобы увидеть совершенно новый экран. В некотором смысле, это просто лучший способ показать пользователю несколько вкладок. Он также имеет возможность динамически добавлять и удалять страницы (или вкладки) в любое время. Рассмотрим идею группировки результатов поиска по определенным категориям и отображения каждой категории в отдельном списке. С помощью ViewPager пользователь может провести пальцем влево или вправо, чтобы увидеть другие категоризированные списки. Использование ViewPager требует определенных знаний как фрагментов, так и адаптеров страниц. В этом случае фрагменты являются «страницами». Каждый экран, к которому ViewPager позволяет пользователю прокручивать страницу, на самом деле является фрагментом. Используя здесь фрагменты вместо представления, мы предоставляем гораздо более широкий спектр возможностей для отображения на каждой странице. Мы не ограничены только списком предметов. Это может быть любая коллекция представлений и виджетов, которые могут нам понадобиться. Вы можете думать о PageAdapters так же, как и о ListAdapters. Работа Адаптера страницы заключается в предоставлении фрагментов (вместо видов) в пользовательский интерфейс для рисования.
Я собрал краткое руководство, которое запускает и запускает ViewPager (с библиотекой поддержки), всего за несколько шагов. Этот урок следует больше нисходящего подхода. Он перемещается от Приложения до Фрагментов. Если вы хотите погрузиться в исходный код самостоятельно, вы можете взять проект здесь .
На уровне приложения
Прежде чем начать, важно убедиться, что библиотека поддержки обновлена из вашего SDK, и что сама библиотека включена в ваш проект. Хотя ViewPager и Fragments являются более новыми конструкциями в Android, их легко перенести на более старые версии Android с помощью библиотеки поддержки. Чтобы добавить библиотеку в ваш проект, вам нужно создать папку «libs» в своем проекте и вставить файл JAR. Для получения дополнительной информации об этом шаге посетите эту страницу на странице справки библиотеки поддержки на сайте разработчика. ,
Настройка файла макета
Следующим шагом является добавление ViewPager в ваш файл макета для вашей деятельности. Этот шаг требует, чтобы вы погрузились в XML-файл вашего макета вместо использования редактора макета GUI. Ваш файл макета должен выглядеть примерно так:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
|
android:layout_width = "match_parent" android:layout_height = "match_parent" > < android.support.v4.view.ViewPager android:id = "@+id/viewpager" android:layout_width = "fill_parent" android:layout_height = "fill_parent" /> </ RelativeLayout > |
Реализация деятельности
Теперь мы соберем основную деятельность. Основные выводы из этой деятельности:
- Класс наследует от FragmentActivity , а не Activity
- Эта активность «имеет» объект PageAdapter и объект Fragment, который мы определим чуть позже
- Активность должна инициализировать свой собственный PageAdapter
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
public class PageViewActivity extends FragmentActivity { MyPageAdapter pageAdapter; @Override public void onCreate(Bundle savedInstanceState) { super .onCreate(savedInstanceState); setContentView(R.layout.activity_page_view); List<Fragment> fragments = getFragments(); pageAdapter = new MyPageAdapter(getSupportFragmentManager(), fragments); ViewPager pager = (ViewPager)findViewById(R.id.viewpager); pager.setAdapter(pageAdapter); } } |
Реализация PageAdapter
Теперь, когда мы раскрыли FragmentActivity, нам нужно создать наш PageAdapter. Это класс, который наследуется от класса FragmentPageAdapater. Создавая этот класс, мы преследуем две цели:
- Убедитесь, что у адаптера есть наш список фрагментов
- Убедитесь, что это дает активность правильный фрагмент
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
class MyPageAdapter extends FragmentPagerAdapter { private List<Fragment> fragments; public MyPageAdapter(FragmentManager fm, List<Fragment> fragments) { super (fm); this .fragments = fragments; } @Override public Fragment getItem( int position) { return this .fragments.get(position); } @Override public int getCount() { return this .fragments.size(); } } |
Получение Фрагментов, Установленных
После завершения PageAdapter все, что теперь нужно, — это сами фрагменты. Нам нужно реализовать две вещи:
- Метод getFragment в PageViewActivity
- Класс MyFragment
1. Метод getFragment прост. Вопрос только в том, как создаются настоящие фрагменты. Сейчас мы оставим эту логику классу MyFragment.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
|
private List<Fragment> getFragments(){ List<Fragment> fList = new ArrayList<Fragment>(); fList.add(MyFragment.newInstance( "Fragment 1" )); fList.add(MyFragment.newInstance( "Fragment 2" )); fList.add(MyFragment.newInstance( "Fragment 3" )); return fList; } |
2. Класс MyFragment также имеет свой собственный файл макета. В этом примере файл макета состоит только из простого TextView. Мы будем использовать этот TextView, чтобы сообщить нам, на какой фрагмент мы сейчас обращаем внимание (обратите внимание, что в коде getFragments мы передаем строку в методе newInstance).
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
<? xml version = "1.0" encoding = "utf-8" ?> android:layout_width = "match_parent" android:layout_height = "match_parent" android:orientation = "vertical" > < TextView android:id = "@+id/textView" android:layout_width = "wrap_content" android:layout_height = "wrap_content" android:layout_centerHorizontal = "true" android:layout_centerVertical = "true" android:textAppearance = "?android:attr/textAppearanceLarge" /> </ RelativeLayout > |
А теперь сам код фрагмента. Единственная хитрость в том, что мы создаем фрагмент с использованием метода статического класса и используем Bundle для передачи информации самому объекту фрагмента.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
|
public class MyFragment extends Fragment { public static final String EXTRA_MESSAGE = "EXTRA_MESSAGE" ; public static final MyFragment newInstance(String message) { MyFragment f = new MyFragment(); Bundle bdl = new Bundle( 1 ); bdl.putString(EXTRA_MESSAGE, message); f.setArguments(bdl); return f; } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { String message = getArguments().getString(EXTRA_MESSAGE); View v = inflater.inflate(R.layout.myfragment_layout, container, false ); TextView messageTextView = (TextView)v.findViewById(R.id.textView); messageTextView.setText(message); return v; } } |
Это оно! С помощью приведенного выше кода вы можете легко запустить и запустить простой адаптер страницы. Вы также можете получить исходный код вышеприведенного руководства от GitHub .
Для более продвинутых разработчиков
На самом деле есть несколько разных типов FragmentPageAdapters. Важно знать, кто они и чем занимаются, поскольку знание этой информации может сэкономить ваше время при создании сложных приложений с помощью ViewPager. FragmentPagerAdapter — более общий для использования PageAdapter. Эта версия не уничтожает имеющиеся у нее фрагменты, если пользователь потенциально может вернуться к этому фрагменту. Идея состоит в том, что этот PageAdapter используется в основном для «статических» или неизменных фрагментов. Если у вас есть фрагменты, которые являются более динамичными и часто изменяются, вы можете заглянуть в FragmentStatePagerAdapter . Этот адаптер немного более дружественен к динамическим фрагментам и не потребляет почти столько же памяти, сколько FragmentPagerAdapter.