【问题标题】:Switching entire fragments in NavigationDrawer在 NavigationDrawer 中切换整个片段
【发布时间】:2013-06-18 20:05:11
【问题描述】:

我正在研究 developer.android.com 的 NavigationDrawer 示例代码,并尝试将其实现为我的一个应用程序的导航。但是,当我在主窗口中切换片段时遇到了一个问题,因为示例代码重用了相同的片段并且只是切换了一个图像视图。以下是示例中的代码:

private class DrawerItemClickListener implements ListView.OnItemClickListener {
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        selectItem(position);
    }
}

private void selectItem(int position) {
    // update the main content by replacing fragments
    Fragment fragment = new PlanetFragment();
    Bundle args = new Bundle();
    args.putInt(PlanetFragment.ARG_PLANET_NUMBER, position);
    fragment.setArguments(args);

    FragmentManager fragmentManager = getFragmentManager();
    fragmentManager.beginTransaction().replace(R.id.content_frame, fragment).commit();

    // update selected item and title, then close the drawer
    mDrawerList.setItemChecked(position, true);
    setTitle(mPlanetTitles[position]);
    mDrawerLayout.closeDrawer(mDrawerList);
}

PlanetFragment 是一个通用片段,只有一个图像视图,没有功能,不适用于我的应用程序。所以,相反,我尝试将 selectItem 方法的第一个块替换为 case/switch:

public void selectItem(int position){
Fragment fragment;
switch(position){
    case 1: fragment = new Fragmentscreentest(); break;
    case 2: fragment = new Fragmentstatusbar(); break;
    case 3: fragment = new Fragmentfullscreen(); break;
    default: fragment = new Fragmentscreentest(); break;
}
    FragmentManager fragmentManager = getFragmentManager();
    fragmentManager.beginTransaction().replace(R.id.content_frame, fragment).commit();

    // update selected item and title, then close the drawer
    mDrawerList.setItemChecked(position, true);
    setTitle(mPlanetTitles[position]);
    mDrawerLayout.closeDrawer(mDrawerList);
}

并向我的 Fragments 添加了与 PlanetFragment 相同的空构造函数:

public Fragmentstatus() {
    // Empty constructor required for fragment subclasses
}

它不起作用,每当我打开应用程序时,它只在操作栏中显示应用程序图标和标题,没有内容,操作栏上没有任何操作,没有导航抽屉,什么都没有,然后它在大约 a 后崩溃第二。使用原始代码,它可以工作并显示所有内容,但仅适用于一个片段。

如何在 NavigationDrawer 中实际切换 Fragments?

【问题讨论】:

  • 从您的 logcat 发布崩溃的堆栈跟踪。
  • 谢谢,已经修复,mike.b93 的答案并修复了一个不相关的错误。

标签: android android-fragments


【解决方案1】:

看看我的代码:

private class DrawerItemClickListener implements ListView.OnItemClickListener {

        @Override
        public void onItemClick(AdapterView parent, View view, int position, long id) {
            selectItem(position);
        }
    }

private void selectItem(int position) {

        switch (position) {

            case 0:

                fragmentManager.beginTransaction()
                        .replace(R.id.content_frame, new MainActivityFragment())
                        .commit();
                break;

            case 1:

                fragmentManager.beginTransaction()
                        .replace(R.id.content_frame, new DbListViewFragment())
                        .commit();
                break;

            case 2:

                fragmentManager.beginTransaction()
                        .replace(R.id.content_frame, new StatisticsFragment())
                        .commit();
                break;

            case 3:

                fragmentManager.beginTransaction()
                        .replace(R.id.content_frame, new CalculatorFragment(), "calculator")
                        .commit();
                break;

        }

我正在使用开关盒。位置 0 是抽屉内 ListView 中的第一项。

摘自我对这个问题的回答:DrawerLayout on click disabled after first event

编辑:

如果您想在开始时选择一个 Fragment,您可以在 onCreate 方法结束时这样做:

if (savedInstanceState == null) {
            selectItem(0);
        }

0 是你想要的 Fragment 的位置

【讨论】:

  • 谢谢,这并修复了我脚本中一个完全不相关的错误对我有用。我会投票,但由于我作为新用户的身份无法投票,但我接受了答案。
  • @MarcelUlbrich 很高兴为您提供帮助,只要您被允许,请随时投票:D
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多