ViewPager with FragmentPagerAdapter

来源:互联网 发布:python开发安卓程序 编辑:程序博客网 时间:2024/06/06 03:33

http://xufei.logdown.com/posts/2015/01/04/viewpager-with-fragmentpageradapter

使用 Fragment 和 ViewPager 实现不同pager.

ViewPager 的布局
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="vertical"    android:background="@color/yellow">    <android.support.v4.view.ViewPager        android:id="@+id/vpPager"        android:layout_width="match_parent"        android:layout_height="wrap_content">        <android.support.v4.view.PagerTabStrip            android:id="@+id/pager_header"            android:layout_width="match_parent"            android:layout_height="wrap_content"            android:layout_gravity="top"            android:paddingBottom="4dp"            android:paddingTop="4dp" />    </android.support.v4.view.ViewPager></LinearLayout>
编写 Fragment
public class FirstFragment extends Fragment {    // Store instance variables    private String title;    private int page;    // newInstance constructor for creating fragment with arguments    public static FirstFragment newInstance(int page, String title) {        FirstFragment fragmentFirst = new FirstFragment();        Bundle args = new Bundle();        args.putInt("someInt", page);        args.putString("someTitle", title);        fragmentFirst.setArguments(args);        return fragmentFirst;    }    // Store instance variables based on arguments passed    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        page = getArguments().getInt("someInt", 0);        title = getArguments().getString("someTitle");    }    // Inflate the view for the fragment based on layout XML    @Override    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {        View view = inflater.inflate(R.layout.fragment_first, container, false);        TextView tvLabel = (TextView) view.findViewById(R.id.tvLabel);        tvLabel.setText(page + " -- " + title);        return view;    }}

这里只写一个Fragment 例子,其他基本一样。

编写 Adapter
public static class MyPagerAdapter extends FragmentPagerAdapter {    private static int NUM_ITEMS = 3;    public MyPagerAdapter(FragmentManager fragmentManager) {        super(fragmentManager);    }    @Override    public int getCount() {        return NUM_ITEMS;    }    @Override    public Fragment getItem(int position) {        switch (position) { // 根据 position 设置每个Fragment View        case 0:             return FirstFragment.newInstance(0, "Page # 1");        case 1:             return FirstFragment.newInstance(1, "Page # 2");        case 2:             return SecondFragment.newInstance(2, "Page # 3");        default:          return null;        }    }    @Override    public CharSequence getPageTitle(int position) {      return "Page " + position;    }}
在 FragmentActivity 中使用 Adapter

使用

public class MainActivity extends FragmentActivity {    FragmentPagerAdapter adapterViewPager;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_home);        ViewPager vpPager = (ViewPager) findViewById(R.id.vpPager);        adapterViewPager = new MyPagerAdapter(getSupportFragmentManager());        vpPager.setAdapter(adapterViewPager);    }    // ...}
在 Fragment 中使用 Adapter

当 APP 本身已经用 FragmentTabHost 实现了底部 Tab 功能,现在需要在其中一个 Fragment 实现顶部 Tab 功能时,就需要在 Fragment 中使用 ViewPager 。

public class Fragment2 extends Fragment {    private ViewPager mViewPager;    @Override    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {        View view = inflater.inflate(R.layout.fragment_content_2, null);        mViewPager = (ViewPager) view.findViewById(R.id.vpPager);        mPagerAdapter = new MyPagerAdapter(getFragmentManager());        mViewPager.setAdapter(mPagerAdapter);        mViewPager.setOffscreenPageLimit(3); // 设置ViewPager个数        controlView();        return view;    }    //....}

在使用过程中遇到 Bug,重现的步骤是第一次点击 ViewPager Fragment ,再点击一个其他的 Fragment ,再点击回页面就会崩溃。报错信息:

The specified child already has a parent. You must call removeView() on the child's parent first.

在最初实现中我使用如下方式创建View

public class Fragment2 extends Fragment {    private View mView;    private ViewPager mViewPager;    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        mView = getActivity().getLayoutInflater().inflate(R.layout.fragment_content_2, null);        mViewPager = (ViewPager) mView.findViewById(R.id.vpPager);        mPagerAdapter = new MyPagerAdapter(getFragmentManager());        mViewPager.setAdapter(mPagerAdapter);        mViewPager.setOffscreenPageLimit(2);    }    @Override    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {        return mView;    }}

这种方式的好处在与只需要在 onCreate 时把 View 创建好就行。但是在 Fragment 和 Fragment ViewPager 组合使用会导致Bug。

设置 OnPageChangeListener
private void controlView() {    mViewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {        @Override        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {            Toast.makeText(getActivity().getApplicationContext(),                    "选择页面: " + position, Toast.LENGTH_SHORT).show();        }        @Override        public void onPageSelected(int position) {        }        @Override        public void onPageScrollStateChanged(int state) {        }    });}

Resource

http://stackoverflow.com/questions/23149981/fragments-the-specified-child-already-has-a-parent-you-must-call-removeview


0 1
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 15岁一周鲁了3次怎么办 月经摊迟三天内裤有白带怎么办 怀孕内裤上有黄黄的分泌物怎么办 老公出轨想离婚但舍不得孩子怎么办 老婆出轨离婚又舍不得家我该怎么办 怀孕一个月刚刚自慰有点流血怎么办 老公出轨还不知道悔改妻子怎么办 离婚了前妻户口还在再婚怎么办 怀孕六个月内裤老是湿有异味怎么办 怀孕五个月内裤总是湿有异味怎么办 耳朵里面有个洞老是流水冒浓怎么办 宝宝拉粑粑有臭酸味怎么回事怎么办 老婆晚上回家内裤是湿的尿味怎么办 怀孕五个月下身痒内裤湿怎么办 哺乳期奶水太多经常弄湿衣服怎么办 麻料裙子一坐下就皱怎么办 不小心把答题卡弄皱了怎么办 嘴巴又干又黏又臭怎么办 不小心把红枣核吞了怎么办 小天才电话手表被偷了怎么办 18k金被火烧黑了怎么办 衣服掉色染到别的衣服上怎么办 夏天太阳太毒刚发芽的花种子怎么办 长斑了怎么办 喝玫瑰花茶能祛斑吗 烧纸火纸迷信纸利润太低怎么办 刚买的绣球花花有点蔫怎么办 ZF葡7正常佩戴动能太满怎么办 怀孕初期老婆婆做的菜不好吃怎么办 调节协议已签字不签收调解书怎么办 给晋中苗圃拉了树苗没拿上钱怎么办 多肉旁边长出好多小株怎么办 烤瓷牙制备时颌关系不够怎么办 对门放石头正对我家大门怎么办 合租的室友关门开门特别大声怎么办 三周岁的宝宝小阴唇再次粘连怎么办 小阴唇内侧长了毛囊炎很大疼怎么办 小阴唇上一个黄豆大的硬疙瘩怎么办 梦幻西游手游金币兑换上限了怎么办 手机放裤子口袋里易拔出怎么办 两个月宝宝拉肚子怎么办吃纯母乳 花王泡沫染停留时间太久怎么办