Панель инструментов 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;
} 

У меня была такая же проблема, поэтому после работы над этим эти строки кода отлично подходят для меня.