2012-12-26 48 views
1

我知道很多在ViewPager中使用片段的应用程序。我也在我的应用程序中需要它。我没有找到任何指导,我怎么能做到这一点排除this。这里是我的代码:如何正确使用ViewPager片段?

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

    } 

} 

但是这段代码工作不正常。有时我会在我的Fragment1中出现关于getActivity()返回null的错误。我从这个网站和其他关于这个错误读了很多帖子,现在我知道这是不好的方法 - 使用向量来存储片段。但我仍然不知道,如何正确使用带碎片的ViewPager。请帮忙。

+1

由于大约95%的展示'ViewPager'的示例应用程序是通过在'ViewPager'中使用片段来演示的,所以*特别*会让您感到困惑? – CommonsWare

+0

你应该重命名你的类,在Android中已经有一个PagerAdapter类... – Matthieu

+1

并且在ViewPager中的碎片上有很多教程:http://tamsler.blogspot.com/2011/10/android-viewpager -and-fragments.html,http://thepseudocoder.wordpress.com/2011/10/05/android-page-swiping-using-viewpager/,http://alchemiasoft.wordpress.com/2012/02/15/使用片段在一个视图Pager/... – Matthieu

回答

1

即使我一开始并不理解这个概念,我也不会说我完全理解它。但是,

这里是我如何在我的示例应用程序中使用的片段:

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

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。以下是我正在做它:

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:我只是一个片段这个例子:

下面的代码:

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:最后一部分是布局:这将是起点。

<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> 

最后,一件重要的事情是,片段数量应该等于主活动中定义的字符串数组。如果没有,应用程序崩溃。

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

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