android常用控件ViewPager(二) ViewPager与Fragment

在上一篇中提到过ViewPager通常和Fragment一起使用来达到View的切换效果。为此google也提供了两个与Fragment的适配器。分别为 FragmentPagerAdapter与FragmentStatePagerAdapter。前者会缓存三个Fragment。后者在我们切换不同的Fragment的时候,我们会把前面的Fragment销毁。但会把我们的我们Fragment的Bundle在我们的onSaveInstanceState(Bundle)保存下来。等用户切换回来的时候,我们的Fragment就会根据我们的instance state恢复出来。在使用方法上两者没多大差别,但在使用场景上FragmentPagerAdapter适用于TAB项较少,而FragmentStatePagerAdapter适用于需要大量TAB项的工程。

(一)建立一个适用于Fragment的适配器

  使用Fragment的时候适配器要使用上述两种之一。此处以FragmentStatePagerAdapter为例。

//FragmentPagerAdapter
public class MyFragmentPagerAdapter extends FragmentStatePagerAdapter {
    ArrayList<Fragment> list;
    public MyFragmentPagerAdapter(FragmentManager fm, ArrayList<Fragment> list) {
        super(fm);
        this.list = list;

    }


    @Override
    public int getCount() {
        return list.size();
    }

    @Override
    public Fragment getItem(int arg0) {
        return list.get(arg0);
    }
}

这个适配器较为简单,不需要像PagerAdapter那样必须实现四大函数。接下来就需要建立自己Fragment了。

(二)建立一个自己的Fragment。

  

public class TestFragment extends Fragment {
    private static final String TAG = "TestFragment";
    private String hello;// = "hello android";
    private String defaultHello = "default value";

    public static TestFragment newInstance(String s) {
        TestFragment newFragment = new TestFragment();
        Bundle bundle = new Bundle();
        bundle.putString("hello", s);
        newFragment.setArguments(bundle);
        return newFragment;

    }



    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        Log.d(TAG, "TestFragment-----onCreateView");
        Bundle args = getArguments();
        hello = args != null ? args.getString("hello") : defaultHello;
        View view = inflater.inflate(R.layout.guide_2, container, false);
        TextView viewhello = (TextView) view.findViewById(R.id.tv);
        viewhello.setText(hello);
        return view;

    }
}

这里在Fragment的onCreateView 中给一个textview复制,作为标示。
Fragment会在后续的文章中介绍。

(三)xml文件与mainActivity。

  这里需要为fragment提供一个xml文件 因此需要两个xml文件。
mainactivity

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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:orientation="vertical">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">


        <TextView
            android:id="@+id/tv_guid1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1.0"
            android:gravity="center"
            android:text="特性1"
            android:textSize="18sp"/>
        <TextView
            android:id="@+id/tv_guid2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1.0"
            android:gravity="center"
            android:text="特性2"
            android:textSize="18sp"/>

        <TextView
            android:id="@+id/tv_guid3"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1.0"
            android:gravity="center"
            android:text="特性3 "
            android:textSize="18sp"/>

        <TextView
            android:id="@+id/tv_guid4"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1.0"
            android:gravity="center"
            android:text="特性4"
            android:textSize="18sp"/>

    </LinearLayout>

    <ImageView
        android:id="@+id/cursor"
        android:layout_width="90dp"
        android:layout_height="wrap_content"
        android:scaleType="matrix"

        android:src="@drawable/cursor"/>

    <android.support.v4.view.ViewPager
        android:id="@+id/viewpager"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:flipInterval="30"
        android:persistentDrawingCache="animation"/>
</LinearLayout >

Fragment的xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical"
    android:background="#158684" >
    <TextView
        android:id="@+id/tv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="TextView" />
</RelativeLayout>

接下来是Activity中添加适配器代码。

  public void InitViewPager(){
        mPager = (ViewPager)findViewById(R.id.viewpager);
        fragmentList = new ArrayList<Fragment>();
        Fragment oneFragment= TestFragment.newInstance("this is one fragment");
        Fragment secondFragment = TestFragment.newInstance("this is second fragment");
        Fragment thirdFragment = TestFragment.newInstance("this is third fragment");
        Fragment fourthFragment = TestFragment.newInstance("this is fourth fragment");
        fragmentList.add(oneFragment);
        fragmentList.add(secondFragment);
        fragmentList.add(thirdFragment);
        fragmentList.add(fourthFragment);
        //给ViewPager设置适配器
        mPager.setAdapter(new MyFragmentPagerAdapter(getSupportFragmentManager(), fragmentList));
        mPager.setCurrentItem(0);//设置当前显示标签页为第一页
        mPager.addOnPageChangeListener(new MyOnPageChangeListener());
    }

这样就可以将ViewPager和Fragment联系起来,实现在滑动中切换Fragment的效果了。具体代码可在GIT上下载。
GIT:https://github.com/everyhappy/ViewPagerDemo2

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值