如何正确使用片段,ViewPager? [英] How to properly use fragments with ViewPager?

查看:197
本文介绍了如何正确使用片段,ViewPager?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我知道用碎片ViewPager许多应用。我需要在我的应用程序了。我没有发现任何指导我怎么能做到这一点排除的这个。这里是我的code:

I know many applications using fragments in ViewPager. I need it in my application too. I have no found any guide how I can to do it exclude this. And here is my code:

public class MainActivity extends FragmentActivity {

    Vector<Fragment> fragments;
    ViewPager viewPager;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        viewPager = (ViewPager) findViewById(R.id.pager);

        fragments = new Vector<Fragment>();
        fragments.add(Fragment.instantiate(this, Fragment1.class.getName()));
        fragments.add(Fragment.instantiate(this, Fragment2.class.getName()));

        viewPager.setOffscreenPageLimit(fragments.size());
        PagerAdapter pagerAdapter = new PagerAdapter(super.getSupportFragmentManager(), fragments);

        viewPager.setAdapter(pagerAdapter);

        viewPager.setCurrentItem(0);
    }

    class PagerAdapter extends FragmentPagerAdapter {

        private List<Fragment> fragments;

        public PagerAdapter(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();
        }

    }

}

但是,这code不尽如人意。有时候,我在我的片段1约getActivity()返回NULL出现错误。我读了这个错误本网站和其他的很多帖子,现在我知道这是坏的方式 - 用向量来存储碎片。但我还是不知道,该怎么办ViewPager与片段正常。请帮助。

But this code doesn't working well. Sometimes I get error in my Fragment1 about getActivity() return null. I read many posts from this site and other about this error and now I know that is bad way - use Vector for storing fragments. But I still don't know, how to do ViewPager with fragments properly. Please, help.

推荐答案

即使我有麻烦理解概念起初,我不会说我完全理解它。但是,

Even I had trouble understanding the concept at first and I won't say that I fully understood it. But,

以下是我使用的片段在我的示例应用程序:

Here's how I am using fragment in my sample application:

第1步:创建我的适配器:

Step 1: Creating my Adapter:

public class AllPagesAdapter extends FragmentStatePagerAdapter {



            public AllPagesAdapter(FragmentManager fm) {

                super(fm);

            }

            @Override
            public Fragment getItem(int index) {

        switch (index) {
            case 0:

                return new Fragment1();

            case 1:

                return new Fragment2();
            case 2:

                return new Fragment3();

            case 3:

                return new Fragment4();

            case 4:

                return new Fragment5();


        }
        return null;


    }

    @Override
    public int getCount() {
        return 5;
    }

}

第2步:在主要活动,我伸出片段活动和实施ActionBar.TabListener。下面是我如何做它:

Step 2: In the main activity, I am extending fragment activity and implementing an ActionBar.TabListener. Here's how I am doing it:

public class SomeActivity extends FragmentActivity implements ActionBar.TabListener {

    public ViewPager viewPager;
    private AllPagesAdapter mAdapter;
    private ActionBar actionBar;
    private String [] tabs = {"Fragment1","Fragment2","Fragment3","Fragment4","Fragment5"};

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //Initializing all stuff
        viewPager = (ViewPager)findViewById(R.id.pager);

        actionBar = getActionBar();
        mAdapter = new AllPagesAdapter(getSupportFragmentManager());
        viewPager.setAdapter(mAdapter);
        actionBar.setHomeButtonEnabled(true);
        actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);



        //Add the tabs here
        for(String tab_name:tabs){
            actionBar.addTab(actionBar.newTab().setText(tab_name).setTabListener(this));
        }

        viewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener(){

            @Override
        public void onPageSelected(int position){

                //on Page change, that particular page should be selected
                actionBar.setSelectedNavigationItem(position);
            }

            @Override
                public void onPageScrolled(int arg0,float arg1,int arg2){

            }
            @Override
        public void onPageScrollStateChanged(int position){

            }

        });
    }



    @Override
    public void onTabSelected(Tab tab, FragmentTransaction fragmentTransaction) {

        viewPager.setCurrentItem(tab.getPosition());
    }

    @Override
    public void onTabUnselected(Tab tab, FragmentTransaction fragmentTransaction) {



    }

    @Override
    public void onTabReselected(Tab tab, FragmentTransaction fragmentTransaction) {

        viewPager.setCurrentItem(tab.getPosition());

    }
}

步骤3:我只有一个片段,在这个例子中:

Step 3: I have just one fragment for this example:

这里的code:

public class Fragment1 extends Fragment {

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

        //Can be layout you want it to be.
        View databaseview = inflater.inflate(R.layout.database, container, false);

        return databaseview;

    }

}

步骤4:最后一部分是布局:这将是起点

Step 4: Last part is the layout: This will be starting point.

<android.support.v4.view.ViewPager xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/pager"
    android:layout_width="match_parent"
    android:layout_height="match_parent"></android.support.v4.view.ViewPager>

最后,一个重要的事情是,片段的数目应等于在主活动定义的字符串数组。如果不是这样,应用程序崩溃。

Lastly, one important thing is that, number of fragments should be equal to the string array defined in the main activity. If not, the app crashes.

希望我解释得很好..:)

Hope I explained it well..:)

我知道这是一个很老的文章,但这个答案可以用于未来的观众。

I know this is a very old post but this answer can be used for future viewers.

这篇关于如何正确使用片段,ViewPager?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆