如何使用FragmentPagerAdapter使标签具有不同的内容?

我想要有不同的标签,你可以在android市场中滑动。 每个选项卡应该使用一个片段,并使用一个方法。

这是我的FragmentPagerAdapter类:

public class SectionsPagerAdapter extends FragmentPagerAdapter { public SectionsPagerAdapter(FragmentManager fm) { super(fm); } @Override public Fragment getItem(int position) { Fragment fragment =null; switch (position) { case 0: fragment = new ConnectionFragment(); break; case 1: fragment = new DataFragment(); break; case 2: fragment = new GraphFragment(); break; } return fragment; } @Override public int getCount() { // Show 3 total pages. return 3; } } 

我有三个类为每个片段types/选项卡:

 public static class ConnectionFragment extends Fragment { public static final String ARG_SECTION_NUMBER = "section_number"; public String stringConnectionStatus = "Offline"; public String stringWiflyIp = "0.0.0.0"; public ConnectionFragment() {} @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View connectionView = inflater.inflate(R.layout.fragment_connection, container, false); TextView statusView = (TextView) connectionView.findViewById(R.id.status_label); statusView.setText("Connection status: " + stringConnectionStatus); TextView ipView = (TextView) connectionView.findViewById(R.id.ip_label); ipView.setText("WiFly IP: " + stringWiflyIp); /**TextView sectionBarView = (TextView) connectionView .findViewById(R.id.section_label); sectionBarView.setText("pups");"*/ return connectionView; } } public static class DataFragment extends Fragment { public DataFragment() {} @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View dataView = inflater.inflate(R.layout.fragment_data, container, false); TextView sectionBarView = (TextView) dataView .findViewById(R.id.section_label); sectionBarView.setText("pups2"); return dataView; } } public static class GraphFragment extends Fragment { public GraphFragment() { } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.fragment_graph, container, false); TextView sectionBarView = (TextView) rootView .findViewById(R.id.section_label); sectionBarView.setText("pups3"); return rootView; } } 

每个片段应该是可定制的,这就是为什么我有三个class。

不过,应用程序在getItem方法中崩溃。 有任何想法吗? 谢谢!

编辑:完整的MainActivity.java

 import ... public class MainActivity extends FragmentActivity { /** * The {@link android.support.v4.view.PagerAdapter} that will provide * fragments for each of the sections. We use a * {@link android.support.v4.app.FragmentPagerAdapter} derivative, which * will keep every loaded fragment in memory. If this becomes too memory * intensive, it may be best to switch to a * {@link android.support.v4.app.FragmentStatePagerAdapter}. */ SectionsPagerAdapter mSectionsPagerAdapter; public List<String> fragments = new Vector<String>(); /** * The {@link ViewPager} that will host the section contents. */ ViewPager mViewPager; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // Create the adapter that will return a fragment for each of the three // primary sections of the app. mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager()); // Set up the ViewPager with the sections adapter. mViewPager = (ViewPager) findViewById(R.id.pager); //pager mViewPager.setAdapter(mSectionsPagerAdapter); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } /** * A {@link FragmentPagerAdapter} that returns a fragment corresponding to * one of the sections/tabs/pages. */ public class SectionsPagerAdapter extends FragmentPagerAdapter { public SectionsPagerAdapter(FragmentManager fm) { super(fm); fragments.add(ConnectionFragment.class.getName()); fragments.add(DataFragment.class.getName()); fragments.add(GraphFragment.class.getName()); //fragmentsA = "fragments"; } @Override public Fragment getItem(int position) { // getItem is called to instantiate the fragment for the given page. // Return a DummySectionFragment (defined as a static inner class // below) with the page number as its lone argument. /*Fragment fragment =null; switch (position) { case 0: fragment = new ConnectionFragment(); break; case 1: fragment = new DataFragment(); break; case 2: fragment = new GraphFragment(); break; } return fragment;*/ return Fragment.instantiate(getBaseContext(), fragments.get(position)); } @Override public int getCount() { // Show 3 total pages. return 3; } @Override public CharSequence getPageTitle(int position) { Locale l = Locale.getDefault(); switch (position) { case 0: return getString(R.string.title_section1).toUpperCase(l); case 1: return getString(R.string.title_section2).toUpperCase(l); case 2: return getString(R.string.title_section3).toUpperCase(l); } return null; } } /** * A dummy fragment representing a section of the app, but that simply * displays dummy text. */ public static class ConnectionFragment extends Fragment { /** * The fragment argument representing the section number for this * fragment. */ public static final String ARG_SECTION_NUMBER = "section_number"; public String stringConnectionStatus = "Offline"; public String stringWiflyIp = "0.0.0.0"; public ConnectionFragment() {} @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View connectionView = inflater.inflate(R.layout.fragment_connection,container, false); TextView statusView = (TextView) connectionView.findViewById(R.id.status_label); statusView.setText("Connection status: " + stringConnectionStatus); TextView ipView = (TextView) connectionView.findViewById(R.id.ip_label); ipView.setText("WiFly IP: " + stringWiflyIp); /**TextView sectionBarView = (TextView) connectionView .findViewById(R.id.section_label); sectionBarView.setText("pups");"*/ return connectionView; } } public static class DataFragment extends Fragment { public DataFragment() {} @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View dataView = inflater.inflate(R.layout.fragment_data, container, false); //TextView sectionBarView = (TextView) dataView.findViewById(R.id.section_label); //sectionBarView.setText("pups2"); return dataView; } } public static class GraphFragment extends Fragment { public GraphFragment() {} @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.fragment_graph, container, false); //TextView sectionBarView = (TextView) rootView.findViewById(R.id.section_label); //sectionBarView.setText("pups3"); return rootView; } } } 

Solutions Collecting From Web of "如何使用FragmentPagerAdapter使标签具有不同的内容?"

创build适配器:

 class MyPagerAdapter extends FragmentPagerAdapter { public List<String> fragmentsA; public MyPagerAdapter(FragmentManager fm) { super(fm); fragmentsA = fragments; } @Override public Fragment getItem(int position) { //return MyFragment.newInstance(); return Fragment.instantiate(context, fragmentsA.get(position)); } @Override public CharSequence getPageTitle(int position) { //return CONTENT[position % CONTENT.length].toUpperCase(); return mEntries.get(position % CONTENT.length).toUpperCase(); } @Override public int getCount() { // return CONTENT.length; return mEntries.size(); } @Override public int getItemPosition(Object object) { return POSITION_NONE; } } 

每个片段属于不同的类别。

所以你必须定义一个片段列表(这些转到主要的FragmentActivity):

 static MyPagerAdapter adapter; 

并用碎片填充它:

 fragments.add(ConnectionFragment.class.getName()); fragments.add(DataFragment.class.getName()); fragments.add(Tab3.class.getName()); //..etc 

然后你必须像这样添加片段到适配器:

  pager = (ViewPager)findViewById(R.id.viewpager); adapter = new MyPagerAdapter(getSupportFragmentManager()); pager.setAdapter(adapter); 

MyPagerAdaper将遍历fragments列表中包含的所有片段,然后将实例化它们中的每一个fragments

在你的FragmentPagerAdapter#getItem方法中,不要创build碎片的对象。 你需要以下面的方式返回片段 –

 return Fragment.instantiate(context, ConnectionFragment.class.getName()); 

这意味着该方法看起来像这样 –

 public class SectionsPagerAdapter extends FragmentPagerAdapter { public SectionsPagerAdapter(FragmentManager fm) { super(fm); } @Override public Fragment getItem(int position) { Fragment fragment =null; switch (position) { case 0: fragment = Fragment.instantiate(context, ConnectionFragment.class.getName()); break; case 1: fragment = Fragment.instantiate(context, DataFragment.class.getName()); break; case 2: fragment = Fragment.instantiate(context, GraphFragment.class.getName()); break; } return fragment; } @Override public int getCount() { // Show 3 total pages. return 3; } } 

看到这个例子:

  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"); case 2: // Fragment # 1 - This will show SecondFragment return SecondFragment.newInstance(2, "Page # 3"); default: return null; } } // Returns the page title for the top indicator @Override public CharSequence getPageTitle(int position) { return "Page " + position; } }