android - 抽屉导航项目是具有选项卡的 fragment

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

我正在尝试实现两个选项卡以及一个抽屉导航。我可以分别做这两件事,但是当我尝试将两者结合起来时,我遇到了问题。我最初有代码在我的 MainActivity 中创建我的两个选项卡和抽屉导航,当时它是一个 fragment Activity ,但是当我很清楚在抽屉导航上有一个主页选项时,我决定重构代码选项卡变成一个带有选项卡的 fragment ,然后像以前一样用两个 fragment 填充。

启动时似乎没问题,但当我单击抽屉导航中的主页选项时,每个选项卡中的 fragment 似乎都被剥离,每次单击该选项时都会添加两个选项卡。

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

首页 fragment .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。有没有办法做到这一点,这样就不会创建新实例,而是可以存储和恢复 fragment 。如果您需要查看更多代码,请告诉我。

最佳答案

我正在做类似的事情:我有一个抽屉导航,其中一个抽屉项目是带有选项卡的 ViewPager。当我第一次打开 ViewPager 选项卡时一切正常,但是当我在导航到其他选项卡之一后导航回它时,它是空的并且选项卡的数量是原来的两倍(导航到另一个 Activity 并返回正常)。

这里有两个问题,一个是 onCreate 再次运行并再次添加您的选项卡,导致重复的选项卡。您可以通过在添加它们之前检查是否存在或通过在销毁时删除所有选项卡来相对轻松地解决此问题。我添加了这个方法以防其他 Activity/fragment 使用其他选项卡(您还必须将 actionBar 变量作为类变量而不是方法变量来跟踪):

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

空标签似乎是由于不同的 fragment 管理器无法找到正确的 fragment 。查看使用 getSupportFragmentManager/getFragmentManager 和 getChildFragmentManager ( What is difference between getSupportFragmentManager() and getChildFragmentManager()? ) 之间的区别。

解决方法是在寻呼机 fragment 中初始化我的 PagerAdapter(您的 AppSectionsPagerAdapter)时使用 getChildFragmentManager 而不是 getFragmentManager。

appSectionsPagerAdapter = new AppSectionsPagerAdapter(getFragmentManager());

成为

appSectionsPagerAdapter = new AppSectionsPagerAdapter(getChildFragmentManager());

关于android - 抽屉导航项目是具有选项卡的 fragment ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22510159/

相关文章:

android - 在 espresso 测试完成时让 Android 应用程序处于最终状态

java - 将 RegistrationId 发送到后端

javascript - 是否可以检测用户是否打开了您网站的多个选项卡?

Python展开Tabs长度计算

java - 计算圆弧平移多远以避免相交

java - JAVA获取从设定日期起一周内所有日期的列表

java - 图片太大 : OutOfMemory Exception

android - 从日历中选择日期并将其显示在 TextView 中的最佳方法

android - FragmentTabHost 选项卡的内容未出现

emacs - Emacs选项卡的全局配置