web-dev-qa-db-ja.com

Android 4.3メニュー項目showAsAction = "always"は無視されます

Android 4.3(APIレベル18)から利用可能な新しいv7 appcompatライブラリを使用しています。

メニュー項目のshowAsActionでの指定に関係なく、表示されません-常にオーバーフローメニューアイコンを作成し、メニューの下に1つのメニュー項目も配置します。

このようなアクティビティにメニューを追加しようとしています:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.menu_sizes, menu);
    return true;
}

そして、これが私のメニューxmlです:

<menu xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <item Android:id="@+id/menu_add_size"
        Android:title="@string/menu_add_item"
        Android:orderInCategory="10"
        Android:showAsAction="always"
        Android:icon="@Android:drawable/ic_menu_add" />
</menu>

新しいサポートライブラリv7のバグですか、それともコードに何か問題がありますか?以前に何度もActionBarSherlockで同様のコードを使用しています。

113
Mcingwe

おそらく、必要な名前空間がありません:

<menu xmlns:Android="http://schemas.Android.com/apk/res/Android"
      xmlns:[yourapp]="http://schemas.Android.com/apk/res-auto">
    <item Android:id="@+id/menu_add_size"
        Android:title="@string/menu_add_item"
        Android:orderInCategory="10"
        [yourapp]:showAsAction="always"
        Android:icon="@Android:drawable/ic_menu_add" />
</menu>

[yourapp]をアプリ名またはどこでも好きな名前空間に置き換えます。

確認する価値のあるその他のもの:

  • アクティビティクラスがActionBarActivityを拡張しているかどうかを確認します

問題が解決しないか確認してください。


Androidリファレンスドキュメント: アクションボタンの追加 。関連するテキストは次のとおりです。

アプリがAndroid 2.1以降のバージョンとの互換性のためにサポートライブラリを使用している場合、showAsAction属性はAndroid:名前空間から利用できません。代わりに、この属性はサポートライブラリによって提供されます。独自のXML名前空間を定義し、その名前空間を属性プレフィックスとして使用する必要があります。 (カスタムXML名前空間はアプリ名に基づいている必要がありますが、任意の名前にすることができ、宣言したファイルのスコープ内でのみアクセスできます。)

309

自分で考え出した。サポートライブラリv7では、showAsActionは次のようなカスタムネームスペースの下に配置する必要があります。

<menu xmlns:Android="http://schemas.Android.com/apk/res/Android"
      xmlns:balloonberry="http://schemas.Android.com/apk/res-auto">
    <item Android:id="@+id/menu_add_size"
        Android:title="@string/menu_add_item"
        Android:orderInCategory="10"
        balloonberry:showAsAction="always"
        Android:icon="@Android:drawable/ic_menu_add" />
</menu>
52
Mcingwe

また、ActionBarActivity.onCreateOptionsMenu()メソッドで正しいインフレータを使用していることを確認してください。

正しい解決策:

MenuInflater menuInflater = getMenuInflater();
menuInflater.inflate(R.menu.menu_example, menu);

間違った解決策:

MenuInflater menuInflater = new MenuInflater(this);
menuInflater.inflate(R.menu.menu_example, menu);
30
petrnohejl

フラグメントの場合

カスタム名前空間を持つメニューはprevent showAsActionの表示を防ぎます。

Android St​​udioがshouldカスタムネームスペースを使用することを指摘している場合でも、showAsActionに「Android:」プレフィックスを使用すると機能します。

<menu xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <item Android:id="@+id/action_add_checkin"
          Android:title="Add Checkin"
          Android:orderInCategory="10"
          Android:showAsAction="always"
        Android:icon="@Android:drawable/ic_menu_add"/>
</menu>

これは、Android SDK 22とSupport v4フラグメントを使用しており、違いが生じた場合に備えています。

24
Baker

同じ問題が発生しましたが、Android 5.に3つのアイテムがありますが、OSは「常に」属性を無視し、2つのアイテムしか表示しませんでした。ここに私の解決策:

  @Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    Log.d(TAG, "onCreateOptionsMenu()");
    inflater.inflate(R.menu.your_menu, menu);
    for (int j = 0; j < menu.size(); j++) {
        MenuItem item = menu.getItem(j);
        Log.d(TAG, "set flag for " + item.getTitle());
        item.setShowAsActionFlags(MenuItem.SHOW_AS_ACTION_ALWAYS);
    }
}
16
Lukas

私の場合、アプリのbuild.gradle compile 'com.Android.support:appcompat-v7:21.0.3'から削除する必要がありました。

注意:最小SDK = 14で、Android studioによってプロジェクトが作成され、不要な依存関係が挿入されました。

この置換の後、Android:showAsAction = "always"と書くことができます。

6
Anton Kizema

また、名前空間の正しいパスがあることを確認してください。間違っていてもエラーメッセージは表示されません。

持っていた

<menu xmlns:Android="http://schemas.Android.com/apk/res/Android"
      xmlns:myapp="http://schemas.Android.com/res-auto">

の代わりに

<menu xmlns:Android="http://schemas.Android.com/apk/res/Android"
      xmlns:myapp="http://schemas.Android.com/apk/res-auto">

私が知っていたのは、それが機能していないことだけでした。パスの/ apkの部分をどうやって忘れたのかわかりませんが、それは起こりました。エラーメッセージはなく、追跡が困難なバグです。

6
BeccaP

これはあなたの場合ではないかもしれませんが、私は使っていました

new MenuInflater(this).inflate(R.menu.my_menu, menu);

に変更する

getMenuInflater().inflate(R.menu.my_menu, menu);

問題を修正しました!

4
Bakhshi

最も簡単な方法は、次を追加してコードを変更することです

xmlns:app="http://schemas.Android.com/apk/res-auto"

このコードを変更します

Android:showAsAction="always"

app:showAsAction="always"

そして最後に

<menu xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:app="http://schemas.Android.com/apk/res-auto">
    <item Android:id="@+id/menu_add_size"
        Android:title="@string/menu_add_item"
        Android:orderInCategory="10"
        app:showAsAction="always"
        Android:icon="@Android:drawable/ic_menu_add" />
</menu>
0

交換して解決しました

Android:showAsAction="ifRoom"

app:showAsAction="ifRoom"

menuitme xmlは次のようになります。

<item Android:id="@+id/action_refresh"
      Android:title="Refresh"
      Android:icon="@drawable/refresh2"
      app:showAsAction="ifRoom" />
0
Haris

最も簡単な方法は次のとおりです。

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:myapp="http://schemas.Android.com/apk/res-auto">

    <item
        Android:id="@+id/history"
        Android:icon="@drawable/icons8_history_white_medium"
        Android:title="History"
        myapp:showAsAction="always" />
    <item
        Android:id="@+id/synchrnonize"
        Android:icon="@drawable/icons8_synchronize_white_medium"
        Android:title="Synchronize"
        myapp:showAsAction="always" />
</menu>
0
Paweł

このようなカスタム名前空間をshowAsActionおよびactionViewClassに追加します。

<menu xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:app="http://schemas.Android.com/apk/res-auto">
<item Android:id="@+id/search"
    Android:title="@string/search"
    Android:icon="@drawable/ic_search"
    app:showAsAction="collapseActionView|ifRoom"
    app:actionViewClass="Android.widget.SearchView" />
0
<?xml version="1.0" encoding="utf-8"?>
<menu
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:app="http://schemas.Android.com/apk/res-auto"
    >
    <item
        Android:id="@id/back"
        Android:icon="@drawable/back"
        app:showAsAction="always"
        Android:title="@string/back"/>
    <item
        Android:id="@id/save"
        Android:icon="@drawable/le_top_btn_icon_add"
        app:showAsAction="ifRoom"
        Android:title="@string/save"/>
</menu>

supportLibraryVersion = '25 .1.0 'compileSdkVersion = 25で動作しません

「警告」を参照してください

App:showAsActionをxmlns:app = "http://schemas.Android.com/apk/res-auto"のappcompatライブラリとともに使用する必要があります...(Ctrl + F1)

Appcompatライブラリを使用する場合、メニューリソースはAndroid:名前空間ではなくapp:名前空間のshowAsActionを参照する必要があります。

同様に、appcompatライブラリを使用しない場合は、Android:showAsAction属性を使用する必要があります。

警告は無視できると思います。

0
Bill