Главная кнопка в панели действий не работает в Lollipop

у меня проблема, потому что я разрабатываю приложение для леденца без support library v7, поэтому мне нужно использовать standard ActionBar. Ранее я использовал setHomeButtonEnabled в нескольких действиях с actionBar.

когда я переключил тему приложения на материал, все работает нормально, кроме метода setHomeButtonEnabled.

заголовок не является кликабельным.

помогите!

1 ответов


по какой-то причине кто-то в Google решил, что они должны стать no-op. Это можно увидеть ниже.

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

похоже, что ToolbarWidgetWrapper, который используется для сопоставления панели инструментов с различиями ActionBar, рассматривает значок Nav на панели инструментов как "Home As Up Indicator". Так только это кликабельный. Новый логотип, который вы можете установить на панели инструментов, никогда не будет доступен. Они даже не выставляют вид, его private Роллс-глаза.

таким образом, первая работа вокруг, если вы не используете функцию "дом как вверх" или вы готовы объединить Ваш до drawable с вашим домом drawable, то вы можете просто установить в своем android:actionBarStyle вместе с 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);

но это означает, что он не появится, пока активность фактически загружается. Поэтому лучше всего пойти с вариантом theming.

3-й вариант, который был бы лучшим, - это просто стиль кнопки навигации для нового вида панели инструментов. Который использует android:navigationButtonStyle но думаю, что.. они не обнародовали это. Я считаю, что это ошибка geninue, но все это начинает ощущаться как оригинальные проблемы, которые у всех нас были с ActionBar в первом место.

Итак, давайте обойти, то обойти. Хорошо, давайте попробуем просто установить android:navigationIcon на android:toolbarStyle. Нет. Ok позволяет попробовать все другие возможные варианты, которые вы можете придумать, включая использование android:actionBarStyle и android:actionBarTheme. Нет. Это я ожидаю, потому что navigationIcon переопределяется в некотором месте в беспорядке ActionBar/Activity/Toolbar по умолчанию. Я не могу потрудиться найти, где и обойти это.

Ok, поэтому, наконец, позволяет выбрать наиболее гибкий вариант. Падение кнопка "Домой" по умолчанию и использовать наши собственные, реализуя более старую пользовательскую функцию навигации. Это означает,что если вы уже используете пользовательскую навигацию, вам придется объединить свою навигацию с этой.

значения-v21 / стили.в 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>

layout-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 добавьте следующее. И это будет подделка кнопки home.

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