我遇到了问题,因为我正在为没有support library v7
的棒棒糖开发应用,所以我需要使用标准ActionBar
。之前我在setHomeButtonEnabled
的多个活动中使用了actionBar
。
当我将app主题切换为材质时,除了setHomeButtonEnabled方法外,一切正常。
标题无法点击。
帮助!
答案 0 :(得分:18)
出于某种原因,Google的某个人认为这些应该成为无操作者。这可以在下面看到。
<强> ToolbarWidgetWrapper.java 强>
@Override
public void setHomeButtonEnabled(boolean enable) {
// Ignore
}
<强> ToolbarActionBar.java 强>
@Override
public void setHomeButtonEnabled(boolean enabled) {
// If the nav button on a Toolbar is present, it's enabled. No-op.
}
似乎用于将工具栏映射到ActionBar差异的ToolbarWidgetWrapper将工具栏中的导航图标视为“Home As Up Indicator”。所以只有那部分是可点击的。您可以在工具栏上设置的新徽标永远无法点击。他们甚至不公开视图,它的private
卷眼。
所以第一个解决方法是,如果你不使用'Home As Up'功能,或者你愿意将你的up drawable与你的home drawable相结合,那么你只需在你的android:homeAsUpIndicator
属性中设置android:actionBarStyle
属性{1}}以及android:displayOptions="homeAsUp"
。
<style name="AppBaseTheme" parent="@android:style/Theme.Material.Light.DarkActionBar">
<item name="android:actionBarStyle">@style/ActionBar</item>
</style>
<style name="ActionBar" parent="@android:style/Widget.Material.Light.ActionBar.Solid">
<item name="android:background">@color/action_bar_bg</item>
<item name="android:displayOptions">homeAsUp</item>
<item name="android:homeAsUpIndicator">@drawable/app_logo</item>
</style>
显然,使用代码可以完成同样的事情。
getActionBar().setHomeAsUpIndicator(R.drawable.app_logo);
getActionBar().setDisplayHomeAsUpEnabled(true);
但这意味着在活动实际加载时它不会出现。最好选择主题选项。
最好的第三个选项就是为新工具栏视图设置导航按钮的样式。哪个使用android:navigationButtonStyle
,但猜猜是什么......他们没有公开这个。我相信这是一个绝对的错误,但这一切都开始感觉像我们最初在ActionBar中遇到的原始问题。
让我们来解决,解决问题。好吧,让我们尝试在android:navigationIcon
中设置android:toolbarStyle
。不。好的,我们可以尝试使用android:actionBarStyle
和android:actionBarTheme
来考虑所有其他可能的变体。不。我希望这是因为在默认的ActionBar / Activity / Toolbar混乱中某些地方覆盖了navigationIcon。我不能打扰找到它并找到解决办法。
好的,最后让我们选择最灵活的选项。删除默认主页按钮并通过实现旧的自定义导航功能使用我们自己的主页按钮。这意味着如果您已经使用自定义导航,则必须将导航与此导航相结合。
值-V21 / styles.xml
<style name="AppBaseTheme" parent="@android:style/Theme.Material.Light.DarkActionBar">
<item name="android:actionBarStyle">@style/ActionBar</item>
</style>
<style name="ActionBar" parent="@android:style/Widget.Material.Light.ActionBar.Solid">
<item name="android:background">@color/action_bar_bg</item>
<item name="android:displayOptions">showCustom</item>
<item name="android:customNavigationLayout">@layout/nav_layout</item>
</style>
布局-V21 / nav_layout.xml
<?xml version="1.0" encoding="utf-8"?>
<ImageButton xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@android:id/home"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="start|center_vertical"
android:layout_marginEnd="8dp"
android:paddingTop="16dp"
android:paddingBottom="16dp"
android:adjustViewBounds="true"
android:background="?android:attr/actionBarItemBackground"
android:contentDescription="@string/ab_home_description"
android:src="@drawable/app_logo"
android:scaleType="fitCenter"
/>
在您的Activity / BaseActivity类中添加以下内容。这将伪造主页按钮。
@Override
public boolean onPrepareOptionsMenu(final Menu menu)
{
prepareOptionsMenuLollipop(menu);
return super.onPrepareOptionsMenu(menu);
}
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
private void prepareOptionsMenuLollipop(Menu menu)
{
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP){
final MenuItem homeItem = menu.add(Menu.NONE, android.R.id.home,
Menu.NONE, R.string.ab_home_description);
homeItem.setVisible(false);
View homeView = getActionBar().getCustomView().findViewById(android.R.id.home);
homeView.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v)
{
getWindow().getCallback().onMenuItemSelected(Window.FEATURE_OPTIONS_PANEL, homeItem);
}
});
}
}