2013-06-18 42 views
1

我正在通过developer.android.com中的NavigationDrawer示例代码工作,并试图将其作为我的一个应用程序的导航实现。但是,当我在主窗口中切换片段时,我遇到了一个问题,因为示例代码重用了相同的片段,只是切换出了一个imageview。下面是从样本代码:在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是一个通用的片段只有一个ImageView的和没有功能的,它并不适用于我的应用程序。所以,相反,我尝试并用的情况下/开关取代了的SelectItem方法的第一个块:

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

和添加了相同的空constuctor到我的片段作为PlanetFragment具有:

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

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

我该如何切换NavigationDrawer中的碎片?

+0

从logcat发布崩溃的堆栈跟踪。 – Akash

+0

谢谢,已经修复了,mike.b93的答案和修复了一个无关的bug。 –

回答

7

看看我的代码:

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

编辑:

如果你想选择在启动一个片段,你可以在你的onCreate方法结束做这样的:

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

0是你想要的片段的位置

+0

谢谢,这个并且在我的脚本中修正了一个完全不相关的错误对我来说是个诡计。我会喜欢,但不能因为我作为一个新用户的地位,但接受了答案。 –

+1

@MarcelUlbrich高兴地帮助,只要你被允许,随时upvote:D –