2014-11-08 39 views
4

在一个片段中,我试图创建一个带有3个片段的ViewPager,您可以在它们之间滑动。 林无法理解的结构和即时得到错误..如何在PageViewer中显示3个片段

public class ContactFragment extends Fragment { 

FragmentPagerAdapter adapterViewPager; 
private FragmentActivity myContext; 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    ViewGroup rootView = (ViewGroup) inflater.inflate(R.layout.view_pager, container, false); 

    ViewPager vpPager = (ViewPager) rootView.findViewById(R.id.vpPager); 
    adapterViewPager = new MyPagerAdapter(myContext.getSupportFragmentManager()); 
    vpPager.setAdapter(adapterViewPager); 

    return rootView; 
} 

@Override 
public void onAttach(Activity activity) { 
    myContext=(FragmentActivity) activity; 
    super.onAttach(activity); 
} 

public static class MyPagerAdapter extends FragmentPagerAdapter { 
    private static int NUM_ITEMS = 3; 

    public MyPagerAdapter(FragmentManager fragmentManager) { 
     super(fragmentManager); 
    } 

    // Returns total number of pages 
    @Override 
    public int getCount() { 
     return NUM_ITEMS; 
    } 

    // Returns the fragment to display for that page 
    @Override 
    public Fragment getItem(int position) { 
     switch (position) { 
      case 0: // Fragment # 0 - This will show FirstFragment 
       return FirstFragment.newInstance(0, "Page # 1"); 
      case 1: // Fragment # 0 - This will show FirstFragment different title 
       return FirstFragment.newInstance(1, "Page # 2"); 
      default: 
       return null; 
     } 
    } 

    // Returns the page title for the top indicator 
    @Override 
    public CharSequence getPageTitle(int position) { 
     return "Page " + position; 
    } 

    } 
} 

我ViewPager布局XML是这样的:

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

这是我的文字片段I类实例3个碎片:

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_layout, container, false); 
    TextView tvLabel = (TextView) view.findViewById(R.id.tvLabel); 
    tvLabel.setText(page + " -- " + title); 
    return view; 
} 
} 

当我运行应用程序并加载片段它看起来是正确的,但是当我尝试滑动到页面查看器中的新片段崩溃时:

E/AndroidRuntime﹕ FATAL EXCEPTION: main 
Process: org.example.magnusluca.drawertestapp, PID: 3624 
java.lang.NullPointerException: Attempt to write to field 'android.support.v4.app.FragmentManagerImpl android.support.v4.app.Fragment.mFragmentManager' on a null object reference 

回答

20

使用此

@Override 
public Fragment getItem(int position) { 
    switch (position) { 
     case 0: // Fragment # 0 - This will show FirstFragment 
      return FirstFragment.newInstance(0, "Page # 1"); 
     case 1: // Fragment # 0 - This will show FirstFragment different title 
      return FirstFragment.newInstance(1, "Page # 2"); 
     case 2: 
      return FirstFragment.newInstance(2, "Page # 3"); 
     default: 
      return new Fragment(); 
    } 
} 

你应该有3个交换机案件,并默认情况下不应该返回

+0

Ofcourse!非常感谢,完美的作品! – 2014-11-08 22:09:50

+0

谢谢!但我不确定为什么getItem会被称为一个无效位置?既然我们有一个getCount()来保证位置值的正确性? – OlivierM 2016-01-24 20:40:14