Android侧滑菜单布局(DrawerLayout)没有显示正确的指示器图标。

19

我正在尝试使用新的DrawerLayout来展示一个列表。但问题是,虽然我设置了抽屉监听器,但是在操作栏上的指示器仍然是箭头图标,而不是我想要绘制的三条线图标。以下是OnCreate函数:

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

http://www.coderzheaven.com/2013/06/28/navigation-drawer-android/ - Armaan Stranger
我下载了样例应用,它运行得非常好。但是我的代码几乎完全相同,所以我真的不知道问题出在哪里。 - zhengbli
尝试从下载的应用程序中获取代码并根据您的要求进行更改。 - Armaan Stranger
你可以将你的解决方案添加为答案或选择@Pratic的答案作为正确答案,谢谢。 - Muhannad A.Alhariri
4个回答

35
你需要在onPostCreate()中调用ActionBarDrawerToggle对象的syncState()方法。
@Override
protected void onPostCreate(Bundle savedInstanceState) {
    super.onPostCreate(savedInstanceState);
    // Sync the toggle state after onRestoreInstanceState has occurred.
    mDrawerToggle.syncState();
}

1
有相同的问题 - 它很容易被忽视。 - Deminetix

3

对于那些正在搜索或来到这里寻找答案的人:你必须使用DrawerToggle支持.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
        }
    };

这个很好用,而且有一个很棒的动画效果!


这应该是新的最佳答案。 - Björn Kechel

0

同时请仔细检查您的项目中是否定义了自定义ActionBar主题,条件是在style.xml文件中设置android:displayOptions=showTitle。就像这样:

 <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>

0

1
我尝试了两种方法,都没有成功。此外,当我点击箭头图标时,抽屉不会打开。但是在我的测试中,onDrawerClosed / onDrawerOpened 函数确实有效。 - zhengbli

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接