导航抽屉项是具有选项卡的片段

时间:2014-03-19 15:10:51

标签: android android-fragments tabs navigation-drawer android-nested-fragment

我试图实现两个标签并且还有一个导航抽屉。我可以单独做两个,但当我尝试将两者结合起来时,我会遇到问题。我最初有用于创建我的两个标签的代码和我的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。有没有办法这样做,所以没有创建新的实例,而是可以存储和恢复片段。如果您需要查看更多代码,请与我们联系。

1 个答案:

答案 0 :(得分:5)

我正在做类似的事情:我有一个导航抽屉,其中一个抽屉物品是带有标签的ViewPager。当我第一次打开ViewPager选项卡时,一切正常,但是当我导航到其他选项卡之后导航回到它时,它是空的并且有两倍的选项卡(导航到另一个活动并且返回很好)。

这里有两个问题,一个是onCreate再次运行并再次添加标签,导致重复的标签。您可以通过在添加它们之前检查存在或通过删除destroy上的所有选项卡来相对容易地修复此问题。我添加了这个方法,以防其他活动/片段使用其他标签(您还必须将actionBar变量作为类变量而不是方法变量跟踪):

@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());