2013-04-22 64 views
17

我想要有不同的选项卡,您可以在android市场中滑动。每个选项卡应该使用一个片段并为其使用一种方法。如何使用FragmentPagerAdapter使标签具有不同的内容?

这是我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; 
    } 
} 

而且我会为每个片段类型/标签三类:

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

每个片断应该是定制的,这就是为什么我有三个班。

尽管如此,应用程序在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; 
     } 
    } 
} 
+0

你能后的logcat的错误和确切的线错误了吗? – ianhanniballake 2013-04-22 14:42:23

+0

请参阅下面的回答评论 – timolemow 2013-04-22 16:41:23

回答

15

创建适配器:

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将经历01所包含的所有片段列表,然后它将实例化它们中的每一个。

+0

感谢您的快速回复。我应用了你的建议,这就是logcat现在给我的: – timolemow 2013-04-22 16:41:47

+0

04-22 18:15:32.964:E/AndroidRuntime(7540):引起:java.lang.NullPointerException 04-22 18:15:32.964:E/AndroidRuntime(7540):\t at com.example.wiflytemp.MainActivity $ SectionsPagerAdapter。 (MainActivity.java:70) 04-22 18:15:32.964:E/AndroidRuntime(7540):\t at com.example.wiflytemp.MainActivity.onCreate(MainActivity.java:43) 04-22 18:15 :32.964:E/AndroidRuntime(7540):\t at android.app.Activity.performCreate(Activity.java:5104) – timolemow 2013-04-22 16:44:08

+0

04-22 18:15:32.964:E/AndroidRuntime(7540):\t at android.app.Instrumentation 。callActivityOnCreate(Instrumentation.java:1080) 04-22 18:15:32.964:E/AndroidRuntime(7540):\t at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2258) – timolemow 2013-04-22 16:44:41

10

在您的FragmentPagerAdapter#getItem方法中,不要创建碎片的对象。你需要返回的片段通过以下方式 -

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; 
    } 
} 
+0

我没有这个变量“上下文”。它做什么,我需要创建这个吗? – timolemow 2013-04-26 09:02:04

+0

私人上下文上下文; // global and in your onCreate - > this.context = this; – 2014-05-10 22:47:20

+0

在你的Activity中,上下文是this。 – jaibatrik 2014-05-11 05:20:30

0

见这个例子:

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; 
    }   
} 
相关问题