2013-06-30 4 views
0

Я закончил так много учебников по этому вопросу, но я до сих пор не нашел того, что помогло. Проблема в том, что я использую вкладки (с прокруткой) и хочу, чтобы каждая вкладка загружала другой класс (некоторые вкладки будут иметь доступ к разным данным и базам данных, каждая вкладка будет совершенно другой). Я знаю, что мне нужно использовать фрагменты, но в учебниках только каждый фрагмент отображает «Tab 1», «Tab 2» и т. Д. Кто-нибудь знает учебник, в котором объясняется, как это сделать? Это сводит меня с ума! Я провел столько часов, пытаясь понять это. TksИспользование фрагментов с классами в Tabs (Android)

ответ

1

Вот как я это сделать:

Мой MainActivity с моим ViewPager:

public class MainActivity extends SherlockFragmentActivity implements 
     ActionBar.TabListener { 

    /** 
    * 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; 

    /** 
    * 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); 



     // Set up the action bar. 
     final ActionBar actionBar = getSupportActionBar(); 
     actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); 
     // 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); 
     mViewPager.setAdapter(mSectionsPagerAdapter); 

     // When swiping between different sections, select the corresponding 
     // tab. We can also use ActionBar.Tab#select() to do this if we have 
     // a reference to the Tab. 
     mViewPager 
       .setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() { 
        @Override 
        public void onPageSelected(int position) { 
         actionBar.setSelectedNavigationItem(position); 
        } 
       }); 

     // For each of the sections in the app, add a tab to the action bar. 
     for (int i = 0; i < mSectionsPagerAdapter.getCount(); i++) { 
      // Create a tab with text corresponding to the page title defined by 
      // the adapter. Also specify this Activity object, which implements 
      // the TabListener interface, as the callback (listener) for when 
      // this tab is selected. 
      actionBar.addTab(actionBar.newTab() 
        .setText(mSectionsPagerAdapter.getPageTitle(i)) 
        .setTabListener(this)); 
     } 
    } 

    @Override 
    public void onTabSelected(ActionBar.Tab tab, 
      FragmentTransaction fragmentTransaction) { 
     // When the given tab is selected, switch to the corresponding page in 
     // the ViewPager. 
     mViewPager.setCurrentItem(tab.getPosition()); 
    } 

    @Override 
    public void onTabUnselected(ActionBar.Tab tab, 
      FragmentTransaction fragmentTransaction) { 
    } 

    @Override 
    public void onTabReselected(ActionBar.Tab tab, 
      FragmentTransaction fragmentTransaction) { 
    } 

    public class SectionsPagerAdapter extends FragmentPagerAdapter { 

     public SectionsPagerAdapter(FragmentManager fm) { 
      super(fm); 
     } 

     @Override 
     public Fragment getItem(int position) { 
      Fragment fragment = null; 
      if (position == 0) { 
       fragment = new Tab1Fragment(); 
      } 
      if (position == 1) { 
       fragment = new Tab2Fragment(); 
      } 
      if (position == 2) { 
       fragment = new Tab3Fragment(); 
      } 
      if (position == 3) { 
       fragment = new Tab4Fragment(); 
      } 
      return fragment; 
     } 

     @Override 
     public int getCount() { 
      // Show 4 total pages. 
      return 4; 
     } 

     @Override 
     public CharSequence getPageTitle(int position) { 
      switch (position) { 
      case 0: 
       return getString(R.string.title_section1).toUpperCase(); 
      case 1: 
       return getString(R.string.title_section2).toUpperCase(); 
      case 2: 
       return getString(R.string.title_section3).toUpperCase(); 
      case 3: 
       return getString(R.string.title_section4).toUpperCase(); 
      } 
      return null; 
     } 
    } 


} 

Это загружает другой фрагмент, в зависимости от выбранной вкладки. Например, если выбрана вкладка 2, она загружает Tab2Fragment.java

+0

Спасибо за быструю обратную связь, но моя проблема была внутри класса, в частности, невозможно расширить фрагмент и расширить активность. Нужен ли фрагмент для расширения фрагмента? Или я могу просто расширить деятельность? Когда я просто расширяю фрагмент, мой код завален ошибками. Спасибо – JonFinlay

+0

@JonFinlay В моем примере Tab2Fragment должен расширить фрагмент. Кроме того, вы используете панель действий Шерлока? Если ваш нет, в моем ответе выше, убедитесь, что он расширяет FragmentActivity, а не SherlockFragmentActivity –

+0

спасибо! Я попробую, когда я получу минуту. Я не знал о FragmentActivity. Но эта команда: fragment = new Tab1Fragment(); автоматически вызовет другой класс? Когда я это сделал, он принимал только когда я добавил класс в один класс. – JonFinlay

Смежные вопросы