android - 如何在 Appcompat 22 中从汉堡包图标动态更改为向上图标

标签 android android-support-library android-toolbar android-appcompat

我想在同一 Activity 中根据用户输入将工具栏中的汉堡包图标更改为向上图标(“<”)。

这是我的工具栏:

<android.support.v7.widget.Toolbar
    android:id="@+id/toolbar"
    android:layout_width="match_parent"
    android:layout_height="?attr/actionBarSize"
    android:background="?attr/colorPrimary"
    android:minHeight="?attr/actionBarSize"
    app:titleTextAppearance="@style/ToolbarTitle">

关于 MainActivity#onCreate

Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
if (toolbar != null) {
    setSupportActionBar(toolbar);
}
getSupportActionBar().setDisplayHomeAsUpEnabled(true);

这将显示一个汉堡包图标,尽管文档指出“设置是否应将主页显示为“向上”示能”。 https://developer.android.com/reference/android/support/v7/app/ActionBar.html#setDisplayHomeAsUpEnabled(boolean)

在我的事件回调中,我调用了

getSupportActionBar().setDisplayOptions(ActionBar.DISPLAY_HOME_AS_UP | ActionBar.DISPLAY_SHOW_TITLE);

但是它不显示向上图标;相反,汉堡包图标仍然显示。 我很困惑,因为它看起来确实与文档冲突。 有什么方法可以根据用户事件在同一 Activity 中的工具栏中的汉堡包图标和向上图标之间切换?

这是我对 gradle 中支持库的引用:

compile 'com.android.support:support-v4:22.1.0'
compile "com.android.support:appcompat-v7:22.1.0"

还值得注意的是,我的 MainActivity extends AppCompatActivity

最佳答案

在 AppCompt 22 中,他们搞砸了主题。还有 getSupportActionBar().setDisplayHomeAsUpEnabled(true);现在不再做任何事情了。除非您支持旧版,否则我强烈建议您不要使用 setSupportActionbar 并直接在工具栏上执行所有调用。这是现在处理它的正确方法。

要修复主题错误,请将 navigationIcon 添加到您的主题中。您也可以直接在工具栏上执行此操作,但是您必须根据具体情况进行处理。

    <style name="Theme.MyApp.Base" parent="Theme.AppCompat.Light.NoActionBar" >
        <item name="navigationIcon">@drawable/abc_ic_ab_back_mtrl_am_alpha</item>
    </style>

您的下一个要使用 ActionBarDrawerToggle使用您的抽屉导航,V7 不是 V4。这真是个愚蠢的名字,因为它现在只是应该与工具栏一起使用。我不会在这里向您展示如何设置它,因为其他地方有很多示例。

您需要在刚刚创建的 drawerToggle 上setToolbarNavigationClickListener。当你的切换被停用时,这个监听器将被调用,我将在这之后讨论。在这里我只使用 onBackPressed(),如果用户单击 navigationIcon 也就是后退箭头,您的 Activity 上的一个方法。

    drawerToggle.setToolbarNavigationClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            onBackPressed();
        }
    });

现在可以非常轻松地在两者之间动态切换。如果您想要显示汉堡包图标并控制您的抽屉导航,则 drawerToogle.setDrawerIndicatorEnabled(true);。如果您希望它显示 navigationIcon 并在按下时调用上述监听器,请调用 drawerToogle.setDrawerIndicatorEnabled(false);

关于android - 如何在 Appcompat 22 中从汉堡包图标动态更改为向上图标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30065779/

相关文章:

android - 如何让 Eclipse 记住 Android SDK 的位置?

android - 在 sdk 管理器中未找到适用于 Android 库的 Google Cloud Messaging

android - Appcelerator - 来自相机的图像为 Android 旋转 90 度

java - 无法执行 dex : Multiple dex files define Lbolts/AggregateException

android - 我无法将支持库添加到我的 Android Studio 项目

Android - 进度对话框不显示在 AsyncTask 中

java - 如何修复错误包 android.support.v7 不存在?

android - 新工具栏的 AppCompatActivity 没有正确显示主页按钮?

java - Android findViewById 工具栏返回 null

android - 切换到支持库 26 和 AppBarActivity 到 AppCompatActivity 后工具栏菜单项被挤压