更改导航抽屉的图标

31

我在更改导航抽屉图标为自定义图标方面遇到了问题。目前我已经实现了标准的抽屉图标,它在顶部有3条水平线,但现在我想用我的自定义抽屉图标替换它。

这是我当前的 mDrawerToggle

mDrawerToggle=new ActionBarDrawerToggle(this,
    mDrawerLayout,
    R.drawable.app_icon,
    R.string.drawer_open) {
        // My code
    };

你目前是这样处理的吗? - Farbod Salamat-Zadeh
哦,没错 @FarbodSalamat-Zadeh - Tufan
尝试使用图标设置 homeAsUpIndicator()。 - Harin
@Harry 我也试过那个了...mDrawerToggle.setHomeAsUpIndicator(R.drawable.app_icon); - Tufan
5个回答

40

使用下面的代码,它适用于V7 ActionBarDrawerToggle

mDrawerToggle.setDrawerIndicatorEnabled(false);

mDrawerToggle.setHomeAsUpIndicator(R.drawable.your_custom_icon);
 mDrawerToggle.setToolbarNavigationClickListener(new View.OnClickListener() {
@Override
 public void onClick(View v) {
     if (mDrawerLayout.isDrawerVisible(GravityCompat.START)) {
          mDrawerLayout.closeDrawer(GravityCompat.START);
     } else {
         mDrawerLayout.openDrawer(GravityCompat.START);
    }
}
});

2
建议:您可以使用Drawable资源ID将图像文件设置为导航抽屉图标。例如:mDrawerToggle.setHomeAsUpIndicator(R.drawable.ic_navigation_home_icon); 因此,无需使用以下代码:Drawable drawable = ResourcesCompat.getDrawable(getResources(), R.drawable.your_custom_icon, getActivity().getTheme()); - udai
这对我来说是最好的选择。明确设置图标,而不是让Android决定是显示菜单图标还是返回图标,对于我的应用程序来说更加一致。 - dustinrwh
为什么图标不会自动调整大小。当我使用512*512的图标时,它占据了整个ActionBar的空间。 - grantespo

7
这是从创建导航抽屉中的示例代码:

Activity.class

public class MainActivity extends Activity {
    private DrawerLayout mDrawerLayout;
    private ActionBarDrawerToggle mDrawerToggle;
    ...

    public void onCreate(Bundle savedInstanceState) {
        ...

        mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
        mDrawerToggle = new ActionBarDrawerToggle(
                this,                  /* host Activity */
                mDrawerLayout,         /* DrawerLayout object */
                R.drawable.ic_drawer,  /* nav drawer icon to replace 'Up' caret */
                R.string.drawer_open,  /* "open drawer" description */
                R.string.drawer_close  /* "close drawer" description */
                ) {

            /** Called when a drawer has settled in a completely closed state. */
            public void onDrawerClosed(View view) {
                super.onDrawerClosed(view);
                getActionBar().setTitle(mTitle);
            }

            /** Called when a drawer has settled in a completely open state. */
            public void onDrawerOpened(View drawerView) {
                super.onDrawerOpened(drawerView);
                getActionBar().setTitle(mDrawerTitle);
            }
        };

        // Set the drawer toggle as the DrawerListener
        mDrawerLayout.setDrawerListener(mDrawerToggle);

        getActionBar().setDisplayHomeAsUpEnabled(true);
        getActionBar().setHomeButtonEnabled(true);
    }

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

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        mDrawerToggle.onConfigurationChanged(newConfig);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Pass the event to ActionBarDrawerToggle, if it returns
        // true, then it has handled the app icon touch event
        if (mDrawerToggle.onOptionsItemSelected(item)) {
          return true;
        }
        // Handle your other action bar items...

        return super.onOptionsItemSelected(item);
    }

    ...
}

@Tufan 你是否添加了以下代码...`@Override protected void onPostCreate(Bundle savedInstanceState) { super.onPostCreate(savedInstanceState); // 在onRestoreInstanceState发生后同步切换状态。 mDrawerToggle.syncState(); }@Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); mDrawerToggle.onConfigurationChanged(newConfig); }` - Tarun Tak
我已经覆盖了两个方法...看看我的图片,我的图标显示出来了,但是当我想要改变它时,它没有改变。 - Tufan
如果我添加了R.String.drawer_close,它会给我一个错误提示,要么更改构造函数,要么将ic_drawer更改为toolbar。有什么解决办法吗? - Tufan
让我们在聊天中继续这个讨论 - Tufan
1
现在无法工作 - Kishan Solanki
显示剩余6条评论

5

这是主要活动

final DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
                this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);


        toggle.setDrawerIndicatorEnabled(false);

        toggle.setToolbarNavigationClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                drawer.openDrawer(GravityCompat.START);
            }
        });

        toggle.setHomeAsUpIndicator(R.drawable.menuicon);

0
您可以使用以下格式来设置您的mDrawerToggle:
mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout,
    R.drawable.CUSTOM_ICON, // Navigation menu toggle icon
    R.string.DRAWER_OPEN, // Navigation drawer open description
    R.string.DRAWER_CLOSE // Navigation drawer close description
    )

更改您的可绘制对象,并确保它与代码中的名称相同。


1
这个构造函数不存在。唯一类似的东西是使用DrawerArrowDrawable而不是可绘制资源。 - android developer

0

这是主要的布局文件

<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/drawer_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <!-- Framelayout to display Fragments -->

    <FrameLayout
        android:id="@+id/frame_container"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

    <!-- Listview to display slider menu -->

    <ListView
        android:id="@+id/list_slidermenu"
        android:layout_width="240dp"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        android:background="@color/white"
        android:choiceMode="singleChoice"
        android:divider="@color/black"
        android:dividerHeight="1dp" />

</android.support.v4.widget.DrawerLayout>

这是主要的活动

DrawerLayout mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
ActionBarDrawerToggle mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout,
                R.drawable.menuicon, // nav menu toggle icon
                R.string.app_name, // nav drawer open - description for
                                    // accessibility
                R.string.app_name // nav drawer close - description for
                                    // accessibility
        ) {
            public void onDrawerClosed(View view) {
                // getActionBar().setTitle(mTitle);
                // calling onPrepareOptionsMenu() to show action bar icons
                invalidateOptionsMenu();
            }

            public void onDrawerOpened(View drawerView) {
                // getActionBar().setTitle(mDrawerTitle);
                // calling onPrepareOptionsMenu() to hide action bar icons
                invalidateOptionsMenu();
            }
        };
        mDrawerLayout.setDrawerListener(mDrawerToggle);

最后在R.drawable.menuicon处(您可以提供您的图像ID),它将起作用。


2
无论何时我尝试使用您的代码更改图标,都会出现将应用程序图标更改为工具栏的错误。请问您使用的是哪个文件扩展名? - Tufan
看这个链接,我已经按照这个链接操作成功了,如果可能,请检查一下链接中的整个代码。http://www.androidhive.info/2013/11/android-sliding-menu-using-navigation-drawer/ - Hanuman
1
如果我按照您的代码操作,会出现错误:没有匹配 mdrawertoogle 的构造函数。 - Tufan
你使用 ActionBar 还是 Toolbar? - Hanuman
请查看我的解决方案。 - Hanuman
显示剩余3条评论

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