1

我試圖實現兩個選項卡,並且還有一個導航抽屜。我可以單獨做這兩件事,但是當我試圖將兩者結合起來遇到問題時。我最初有用於創建我的兩個選項卡和我的MainActivity中的導航抽屜的代碼,這是當時的片段活動,但是當我清楚地知道對於導航抽屜中的Home選項時,我決定重構代碼將選項卡製作成帶有標籤的片段,然後像以前那樣填充兩個片段。導航抽屜項目是具有選項卡的片段

在啓動似乎很好,但是當我在導航抽屜中單擊home選項時,每個選項卡中的片段似乎被剝離,每次單擊該選項時都會添加兩個選項卡。

private void selectItem(int position) { 
     Fragment fragment = new NullFragment(); 
     switch (position){ 
      case 0: 
       fragment = new HomeFragment(); 
       break; 
      case 1: 
         //Placeholder 
       fragment = new PlanetFragment(); 

     } 
     // update the main content by replacing fragments 
     if (fragment != null) { 
      FragmentManager fragmentManager = getFragmentManager(); 
      fragmentManager.beginTransaction().replace(R.id.content_frame, fragment).commit(); 

      // update selected item and title, then close the drawer 
      drawerListView.setItemChecked(position, true); 
      setTitle(drawerItemTitles[position]); 
      drawerLayout.closeDrawer(drawerListView); 
     } else { 
      // error in creating fragment 
      Log.e("MainActivity", "Error in creating fragment"); 
     } 
    } 

HomeFragment.java

public class HomeFragment extends Fragment implements ActionBar.TabListener { 

    AppSectionsPagerAdapter appSectionsPagerAdapter; 
    ViewPager viewPager; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){ 
     View rootView = null; 
     /*if(savedInstanceState == null){*/ 
     rootView = inflater.inflate(R.layout.activity_home, container, false); 
     appSectionsPagerAdapter = new AppSectionsPagerAdapter(getFragmentManager()); 
     final ActionBar actionBar = getActivity().getActionBar(); 

     actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); 


     viewPager = (ViewPager) rootView.findViewById(R.id.pager); 
     viewPager.setAdapter(appSectionsPagerAdapter); 
     viewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() { 
      @Override 
      public void onPageSelected(int position) { 
       actionBar.setSelectedNavigationItem(position); 
      } 
     }); 

      actionBar.addTab(
        actionBar.newTab() 
          .setIcon(R.drawable.ic_sync_to_cloud) 
          .setTabListener(this)); 

      actionBar.addTab(
        actionBar.newTab() 
          .setIcon(R.drawable.ic_send_to_device) 
          .setTabListener(this)); 


      actionBar.setDisplayShowHomeEnabled(false); 
      actionBar.setDisplayShowTitleEnabled(false); 

     return rootView; 
    } 

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

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

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

我想這是因爲HomeFragment的新實例每次創建,並在其佈局的唯一事情是一個ViewPager。有沒有辦法做到這一點,所以沒有創建一個新的實例,而是片段可以存儲和恢復。如果您需要查看更多代碼,請告知我們。

回答

5

我正在做類似的事情:我有一個導航抽屜,其中一個抽屜項目是帶有標籤的ViewPager。當我第一次打開ViewPager選項卡時,一切正常,但當我導航到其他選項卡之一後導航回到它時,它是空的,並且有兩倍的選項卡(導航到另一個活動並返回很好)。

這裏有兩個問題,一個是onCreate再次運行並再次添加您的選項卡,導致重複的選項卡。您可以通過在添加它們之前檢查是否存在或通過刪除關於銷燬的所有選項卡來相對容易地修復此問題我的情況下添加該方法的其他活動/片段使用其他選項卡(你還必須跟蹤動作條變量爲類變量,而不是方法變量):

@Override 
public void onDestroy() { 
    actionBar.removeAllTabs(); 
    actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD); 
    super.onDestroy(); 
} 

空卡出現是由於不同的片段管理器無法找到正確的片段。查看使用getSupportFragmentManager/getFragmentManager和getChildFragmentManager(What is difference between getSupportFragmentManager() and getChildFragmentManager()?)之間的區別。

解決方法是在分頁器片段中初始化我的PagerAdapter(您的AppSectionsPagerAdapter)時,使用getChildFragmentManager而不是getFragmentManager。

appSectionsPagerAdapter = new AppSectionsPagerAdapter(getFragmentManager()); 

成爲

appSectionsPagerAdapter = new AppSectionsPagerAdapter(getChildFragmentManager()); 
+0

這似乎做的伎倆!非常感謝,我欠你一個。 – Unem

+0

嗨@ntrrobng我有同樣的問題(問題1),但我使用標籤佈局,而不是ActionBar你能幫我嗎 – angel