2014-10-29 122 views
34

经过2天的努力与新的API 21工具栏和appCompat_v7,我想我发现了一个错误。如果你有你的菜单上2层的操作是这样的:AppCompat_v7工具栏作为操作栏不显示菜单中的“始终”操作,但API工具栏确实

<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"/> 

,并这样定义的程序兼容性工具栏:膨胀(或设置setSupportActionBar方法)后

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

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

回答

77

Action Bar training,你必须使用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> 
+0

在我的情况下,这是行不通的,但android:showAsAction =“总是”它的工作。我不明白为什么这不起作用。 – 2014-10-31 13:07:02

+6

@HarshvardhanTrivedi这也是我的情况。但幸运的是我找到了解决方案:在'onCreateActionMode'中不要使用'mode.getMenuInflater()',而是使用'ActionBarActivity'中的'getMenuInflater()'。 – yuku 2014-12-05 06:29:47

+0

@yuku yours是正确的答案。 – agirardello 2015-08-13 21:33:14

3

的xmlns:程序=“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; 
} 

后,我有同样的问题等等吧,这些工作后,代码行适合我。

+0

只是这个答案对我有用<3 thx – 2016-05-31 07:44:53