2013-06-18 78 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 –