如何在 Appcompat 22 中从汉堡包图标动态更改为向上图标
How to dynamically change from Hamburger icon to Up icon in Appcompat 22
如果用户在同一 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);
这将显示一个汉堡包图标,尽管文档说明 "Set whether home should be displayed as an "向上“启示”。
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。这真是个愚蠢的名字,因为它现在只是应该与工具栏一起使用。我不会在这里向您展示如何设置它,因为其他地方有很多示例。
您需要 setToolbarNavigationClickListener
在您刚刚制作的抽屉开关上。当你的切换被停用时,这个监听器将被调用,我将在这之后讨论。如果用户单击 navigationIcon 又名后退箭头,我在这里只使用 onBackPressed()
,你的 activity 上的一个方法。
drawerToggle.setToolbarNavigationClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
onBackPressed();
}
});
现在可以非常轻松地在两者之间动态切换。如果你想要显示汉堡包图标并控制你的导航抽屉,那么 drawerToogle.setDrawerIndicatorEnabled(true);
。如果你想让它显示 navigationIcon 并让上面的监听器在按下时被调用,那么调用 drawerToogle.setDrawerIndicatorEnabled(false);
.
如果用户在同一 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);
这将显示一个汉堡包图标,尽管文档说明 "Set whether home should be displayed as an "向上“启示”。 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。这真是个愚蠢的名字,因为它现在只是应该与工具栏一起使用。我不会在这里向您展示如何设置它,因为其他地方有很多示例。
您需要 setToolbarNavigationClickListener
在您刚刚制作的抽屉开关上。当你的切换被停用时,这个监听器将被调用,我将在这之后讨论。如果用户单击 navigationIcon 又名后退箭头,我在这里只使用 onBackPressed()
,你的 activity 上的一个方法。
drawerToggle.setToolbarNavigationClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
onBackPressed();
}
});
现在可以非常轻松地在两者之间动态切换。如果你想要显示汉堡包图标并控制你的导航抽屉,那么 drawerToogle.setDrawerIndicatorEnabled(true);
。如果你想让它显示 navigationIcon 并让上面的监听器在按下时被调用,那么调用 drawerToogle.setDrawerIndicatorEnabled(false);
.