web-dev-qa-db-ja.com

AppCompat_v7ツールバーのアクションバーはメニューから「常に」アクションを表示しませんが、APIツールバーは表示します

新しいAPI 21ツールバーとappCompat_v7で2日間苦労した後、バグを見つけたと思います。メニューに次のような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クラスを使用すると、メニューレイアウトで定義されたアクションが表示されます...

<Toolbar 
    Android:layout_width="match_parent"
    Android:layout_height="52dp"
    Android:id="@+id/toolbar">
</Toolbar>

ここに何かが足りないかもしれませんが、これまでのところ、appCompatを使用してオーバーフローメニューの外にアクションを表示できませんでした。これに関するヘルプは大歓迎です。

enter image description here

34
Roisgoen

アクションバーのトレーニング ごとに、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>
77
ianhanniballake

まず、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;
} 

私は同じ問題を抱えていたので、それに取り組んだ後、これらのコード行はうまくいきます。

3
ShahinFasihi

プット

xmlns:app = "http://schemas.Android.com/apk/res-auto"メニュータグをint

このような

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