[英]How to properly use fragments with ViewPager?
I know many applications using fragments in ViewPager. 我知道许多应用程序在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();
}
}
}
But this code doesn't working well. 但是此代码无法正常运行。 Sometimes I get error in my Fragment1 about getActivity() return null. 有时我在Fragment1中遇到有关getActivity()返回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. 我从该站点以及有关此错误的其他站点上阅读了许多帖子,现在我知道这是一种不好的方法-使用Vector来存储片段。 But I still don't know, how to do ViewPager with fragments properly. 但是我仍然不知道如何正确处理带有片段的ViewPager。 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: 这是我在示例应用程序中使用片段的方式:
Step 1: Creating my Adapter: 步骤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;
}
}
Step 2: In the main activity, I am extending fragment activity and implementing an ActionBar.TabListener. 步骤2:在主要活动中,我将扩展片段活动并实现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());
}
}
Step 3: I have just one fragment for this example: 步骤3:对于此示例,我只有一个片段:
Here's the 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;
}
}
Step 4: Last part is the layout: This will be starting point. 步骤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>
Lastly, one important thing is that, number of fragments should be equal to the string array defined in the main activity. 最后,重要的一点是,片段的数量应等于main活动中定义的字符串数组。 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. 我知道这是一篇很老的文章,但是这个答案可以供将来的观众使用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.