Панель инструментов AppCompat_v7 как панель действий, не отображающая "всегда" действия из меню, но панель инструментов API
После двух дней борьбы с новой панелью инструментов API 21 и appCompat_v7, я думаю, что нашел ошибку. Если в вашем меню есть 2 действия:
<item
android:id="@+id/action_test"
android:showAsAction="always"
android:icon="@drawable/ic_launcher"
android:title="@string/action_settings"/>
<item
android:id="@+id/action_settings"
android:orderInCategory="100"
android:showAsAction="never"
android:title="@string/action_settings"/>
и панель инструментов AppCompat, определенная следующим образом:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.toolbar.MainActivity" >
<android.support.v7.widget.Toolbar
android:layout_width="match_parent"
android:layout_height="52dp"
android:id="@+id/toolbar">
</android.support.v7.widget.Toolbar>
</RelativeLayout>
после раздувания (или установки метода setSupportActionBar)
Toolbar toolbar = (Toolbar)findViewById(R.id.toolbar);
toolbar.setTitle("esurance");
setSupportActionBar(toolbar);
вы получите меню панели инструментов без значка действия, оно отобразит его в меню переполнения.
Но если вы используете класс панели инструментов из API 21, он покажет ваши действия, как определено в вашем макете меню...
<Toolbar
android:layout_width="match_parent"
android:layout_height="52dp"
android:id="@+id/toolbar">
</Toolbar>
Возможно, мне что-то не хватает, но до сих пор я не мог отображать действия за пределами меню переполнения, используя appCompat. Любая помощь по этому поводу будет высоко оценена.
![enter image description here]()
Ответы
Ответ 1
В упражнении Action Bar вам нужно использовать атрибуты app:showAsAction
, а не атрибут android:showAsAction
:
Обратите внимание, что вышеприведенный атрибут showAsAction использует собственное пространство имен, определенное в теге <menu>
. Это необходимо при использовании любых атрибутов XML, определенных библиотекой поддержки, поскольку эти атрибуты не существуют в платформе Android на старых устройствах. Поэтому вы должны использовать свое собственное пространство имен в качестве префикса для всех атрибутов, определенных библиотекой поддержки.
Итак, ваш файл меню должен выглядеть так:
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" >
<item
android:id="@+id/action_test"
app:showAsAction="always"
android:icon="@drawable/ic_launcher"
android:title="@string/action_settings"/>
<item
android:id="@+id/action_settings"
android:orderInCategory="100"
app:showAsAction="never"
android:title="@string/action_settings"/>
</menu>
Ответ 2
положить
xmlns: app = "http://schemas.android.com/apk/res-auto" внутри вашего тега меню
как это
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
затем используйте app:showAsAction = "always"
Помните, что используйте app:showAsAction
во всем элементе меню, а не android:showAsAction
`
Ответ 3
прежде всего используйте app:showAsAction
вместо android:showAsAction
(например, @ianhanniballake)
после этого в onCreateActionMode
после раздувания вашего меню setShowAsAction
в коде, подобном этому
@Override
public boolean onCreateActionMode(ActionMode mode, Menu menu) {
mode.getMenuInflater().inflate(R.menu.your_menu_name, menu);
menu.findItem(R.id.your_first_menu_id).setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
menu.findItem(R.id.your_second_menu_id).setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
return true;
}
У меня была такая же проблема, поэтому после работы над этим эти строки кода отлично подходят для меня.