2013-07-24 40 views
19

我試圖使用新的DrawerLayout作爲列表。問題是雖然我設置了抽屜監聽器,但操作欄上的指示器仍然是箭頭圖標,而不是我打算繪製的3線圖標。以下是OnCreate功能:Android DrawerLayout不顯示正確的指示器圖標

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_front_page); 

    // Swiping Pager set up 
    mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager()); 

    mViewPager = (ViewPager) findViewById(R.id.pager); 
    mViewPager.setAdapter(mSectionsPagerAdapter); 

    // Sliding Drawer set up 
    mHabitContract = new HabitsContract(this); 
    mDrawerLayout = (DrawerLayout) findViewById(R.id.front_page_layout); 
    mDrawerList = (ListView) findViewById(R.id.habit_list); 
    mDrawerLayout.setDrawerShadow(R.drawable.drawer_shadow, GravityCompat.START); 
    mDrawerList.setAdapter(new HabitAdapter(mHabitContract.GetHabitItems(), this)); 

    // Fixme: Indicator image doesn't show up 
    mDrawerToggle = new ActionBarDrawerToggle(
      this,     /* host Activity */ 
      mDrawerLayout,   /* DrawerLayout object */ 
      R.drawable.ic_navigation_drawer, /* nav drawer image to replace 'Up' caret */ 
      R.string.drawer_open, /* "open drawer" description for accessibility */ 
      R.string.drawer_close /* "close drawer" description for accessibility */ 
    ) { 
     public void onDrawerClosed(View view) { 
      //getActionBar().setTitle(mTitle); 
      invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu() 
     } 

     public void onDrawerOpened(View drawerView) { 
      //getActionBar().setTitle(mDrawerTitle); 
      invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu() 
     } 
    }; 
    mDrawerLayout.setDrawerListener(mDrawerToggle); 

    // Action Bar set up 
    getActionBar().setDisplayHomeAsUpEnabled(true); 
    getActionBar().setHomeButtonEnabled(true); 
    getActionBar().setDisplayShowHomeEnabled(true); 
} 

任何人都可以幫忙嗎?

更新:我發現了這個問題。我添加了onPostCreate函數如下,現在它工作。

protected void onPostCreate(Bundle savedInstanceState) { 
    super.onPostCreate(savedInstanceState); 
    // Sync the toggle state after onRestoreInstanceState has occurred. 
    mDrawerToggle.syncState(); 
} 
+0

http://www.coderzheaven.com/2013/06/28/navigation-drawer-android/ –

+0

我下載了示例應用程序,它運行得非常好。但是我的代碼幾乎完全相同,所以我不太清楚問題所在。 – zhengbli

+0

嘗試從下載的應用程序獲取代碼到您的代碼並根據您的要求進行相應更改。 –

回答

35

您需要syncState()打電話給你的ActionBarDrawerToggle對象從onPostCreate()

@Override 
protected void onPostCreate(Bundle savedInstanceState) { 
    super.onPostCreate(savedInstanceState); 
    // Sync the toggle state after onRestoreInstanceState has occurred. 
    mDrawerToggle.syncState(); 
} 
+1

有同樣的問題 - 它容易被忽視 – Deminetix

+0

這應該是被接受的答案 – serenskye

+0

謝謝!我可以解決這個問題。 – Ataru

0

還要檢查carefuly如果定製ActionBar主題與條件android:displayOptions=showTitle定義到您的項目在style.xml文件。像這樣:

<style name="OrangeBar" parent="@android:style/Widget.Holo.ActionBar"> 
    <item name="android:displayOptions">showTitle</item> 
    ... 
</style> 

它可能會損壞抽屜指示器。爲了避免這種情況,在android:displayOptions添加showHome

<item name="android:displayOptions">showHome|showTitle</item> 
3

對於那些誰正在尋找這樣或來到這裏尋找一個答案:你必須使用DrawerToggle support.v7。按照我的使用方法:

drawerToggle = new ActionBarDrawerToggle(this, drawerLayout, R.string.drawer_opened, R.string.drawer_closed){ 
     public void onDrawerClosed(View view){ 
      //actionBar.setTitle(mTitle); 
      invalidateOptionsMenu(); // crea la llamada para onPrepareOptionsMenu 
     } 
     public void onDrawerOpened(View view){ 
      //actionBar.setTitle(mDrawerTitle); 
      invalidateOptionsMenu(); // crea la llamda para onPrepareOptionsMenu 
     } 
    }; 

這工作正常,並有一個動畫,巖!

+0

這應該是新的最佳答案 –