当前,ViewPager是Android库中最受欢迎的Widget之一。 它已在多个最常用的Android应用中实现,例如Google Play应用和我自己的应用之一RBRecorder :
ViewPager是允许用户向左或向右滑动以查看全新屏幕的小部件。 从某种意义上讲,这是向用户显示多个选项卡的一种更好的方法。 它还具有随时动态添加和删除页面(或选项卡)的能力。 考虑将搜索结果按某些类别分组,并在单独的列表中显示每个类别的想法。 使用ViewPager,用户可以向左或向右滑动以查看其他分类列表。 使用ViewPager需要同时了解Fragments和PageAdapters。 在这种情况下,片段就是“页面”。 ViewPager允许用户滚动到的每个屏幕实际上都是一个Fragment。 通过在此处使用“片段”而不是“视图”,我们可以在每个页面中显示更多的可能性。 我们不仅限于项目列表。 这可以是我们可能需要的任何视图和小部件集合。 您可以以与想到ListAdapters相同的方式来考虑PageAdapters。 页面适配器的工作是向用户界面提供片段(而不是视图)以进行绘制。
我整理了一个快速教程,仅需几个步骤即可启动并运行ViewPager(与支持库一起使用)。 本教程采用了更多的自顶向下方法。 它从应用程序向下移动到片段。 如果您想直接进入源代码,可以在此处获取项目。
在应用程序级别
在开始之前,重要的是要确保从您的SDK更新了支持库,并且该库本身已包含在您的项目中。 尽管ViewPager和Fragments是Android中较新的结构,但通过使用支持库将它们移植回旧版本的Android很容易。 要将库添加到项目中,您需要在项目中创建一个“ libs”文件夹,然后将JAR文件放入其中。有关此步骤的更多信息,请在开发人员站点的支持库帮助页面上查看此页面。 。
设置布局文件
下一步是将ViewPager添加到活动的布局文件中。 此步骤需要您深入了解布局文件的XML,而不是使用GUI布局编辑器。 您的布局文件应如下所示:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
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
- 此Activity“具有” PageAdapter对象和Fragment对象,稍后我们将对其进行定义
- 该活动需要初始化它自己的PageAdapter
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类继承的类。 在创建此类时,我们有两个目标:
- 确保适配器具有我们的片段列表
- 确保它为活动提供了正确的片段
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后,现在所需的只是Fragments本身。 我们需要实现两件事:
- PageViewActivity中的getFragment方法
- MyFragment类
1. getFragment方法很简单。 唯一的问题是如何创建实际的片段。 现在,我们将把这个逻辑留给MyFragment类。
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告诉我们当前正在查看哪个Fragment(注意getFragments代码,我们正在newInstance方法中传入String)。
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
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>
现在是Fragment代码本身:唯一的技巧是,我们使用静态类方法创建片段,然后使用Bundle将信息传递给Fragment对象本身。
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主要用于“静态”或不变的Fragment。 如果您具有动态性更高且经常更改的片段,则可能需要查看FragmentStatePagerAdapter 。 该适配器对动态Fragments更为友好,并且不消耗比FragmentPagerAdapter更大的内存。
翻译自: https://www.javacodegeeks.com/2013/04/android-tutorial-using-the-viewpager.html