Кнопка «Дом» в панели действий не работает в Lollipop

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

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

Заголовок не доступен для кликов.

Помогите!

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

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 рулонные глаза .

Таким образом, первая работа вокруг – если вы не используете функцию «Главная страница» или вы готовы объединить свои возможности с вашим домашним ресурсом, вы можете просто установить атрибут android:homeAsUpIndicator в вашем 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); 

Но это означает, что он не появится во время загрузки. Так что лучше всего пойти с тематическим вариантом.

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

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

Итак, наконец, выберем самый гибкий вариант. Снимите кнопку «Главная» по умолчанию и используйте нашу собственную, реализовав более старую пользовательскую навигационную функцию. Это означает, что если вы уже используете пользовательский nav, вам придется объединить свой навигатор с этим.

Значения-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); } }); } } 
Intereting Posts
Как добавить .so, .mk и другие собственные файлы в Android Studio? Обновления версии схемы для подобных Rails-версий для Android Android Maps API v2: увеличьте текущее местоположение и маркер Насколько безопасно это иметь потребительский ключ Twitter и секретный жесткий код в приложении для Android? Я пытаюсь создать AutoCompleteTextView в моем приложении для Android. Проблема в том, что я не могу ее настроить Android FragmentManager BackStackRecord.run бросает NullPointerException Правильный способ получить объект Realm по его первичному ключу в Android Java Инструмент Android dx Как установить значок приложения в качестве значка уведомления в ящике уведомлений Отправить уведомление GCM автономному устройству Grails 2.4 Spring Websocket SockJs Java Android Client Admob Не заполняется с сервера объявлений – не удалось загрузить объявление: 3 Как уменьшить время, затрачиваемое MPAndroidChart для отображения данных? Тестирование okHttp-запросов с помощью Robolectric – обратные вызовы Google cloud messaging GCM через прокси-сервер