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