Android 4.3のメニュー項目showAsAction =“ always”は無視されました


116

私は、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で同様のコードを何度も使用しています。


2
情報提供の目的-「... "always"は推奨されません。使用"ifRoom"してOSに決定させることをお勧めします。」
ChiefTwoPencils 2013

回答:


313

おそらく必要な名前空間が欠落しています:

<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名前空間はアプリ名に基づく必要がありますが、任意の名前にすることができ、宣言したファイルのスコープ内でのみアクセスできます。)


2
それも私が見つけたものです。ありがとう-間違いなく受け入れられます。しかし、showAsActionはそのカスタム名前空間を使用する必要があります。
Mcingwe 2013

5
「yourapp」は、String.xmlで<string name = "app_name"> yourapp </ string>を意味しますよね?
LOG_TAG 2013年

4
これが機能する理由を誰かが説明できますか?カスタム名前空間を拡張する必要があるのはなぜですか?少し混乱しました。
2013年

8
@dineth appcompatは、ライブラリプロジェクトとして使用されます。つまり、そのすべてのリソース(文字列、ドローアブル、属性...)は、Android名前空間ではなくアプリケーションの名前空間で宣言されます。このshowAsAction属性はandroid-7には存在しなかったため、アプリの名前空間を使用する必要があります
nicopico

22
誰もが「カスタム名前空間」または「アプリに一致する名前空間」と言います。しかし、名前空間は常にhttp://schemas.android.com/apk/res-autoすべての例にあります。それはカスタムのものではなく、アプリと一致するものでもありません。これは、ドキュメントの実際の名前空間です。私は誰もがカスタムプレフィックスを意味すると思いますが、実際には何でもかまいません。これは本当ですか?
Andrew Arnott

52

私を見つけ出した。サポートライブラリ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>

1
「balloonberry」は、String.xmlで「<string name = "app_name"> balloonberry </ string>」を意味しますよね?
LOG_TAG 2013年

5
@LOG_TAG-いいえ、上で入力したとおりにする必要があります。これは文字列ではなく名前空間です。
BeccaP 2013年

ohhh support v7 errrr ... ok on support v4
Yasitha Waduge 2014年

説明をありがとうマッキングウェ
Naik

32

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

正しい解決策:

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

不正解:

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

1
上記のすべての回答とstackoverflowの別の回答を渡しましたが、欠けているのはあなたが答える-getMenuInflater()だけです。これを共有してくれてありがとう。
Amt87

これをありがとう。100以上のすべてのメニューをカスタム名前空間を使用するように変換しましたが、1つの臭い画面がまだ機能していませんでした... 1つのアクティビティがgetMenuInflater()ではなく「新しいMenuInflater」を使用していることがわかりました。トンありがとう!
DiscDev

これは非常に重要です。menuInflater作成(2ウェイ)を使用していました。ありがとう
wtk 2018年

24

以下のためのかけら

カスタム名前空間を持つメニューは showAsActionが表示されないようにします。

showAsActionに "android:"プレフィックスを使用すると機能しますが、Android Studioはカスタム名前空間を使用する必要があると述べています。

<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フラグメントを使用しています。


私の問題を解決したのはそれだけです(ただし、このエラーが表示されています)。よろしくお願いします!
user2630165 '30年

3
<item>内のtools:ignore = "AppCompatResource"を使用して、XMLレイアウトのエラー/警告を抑制することができます。ここにドキュメント:tools.android.com/tips/lint/suppressing-lint-warnings
ベイカー

あなたの答えとアントン・キゼマは私にとって正しい解決策です。そしてまた先端をありがとうtools:ignore
はた

16

同じ問題が発生しましたが、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);
    }
}

1
setShowAsActionFlags()API 14が必要ですが、これはまだ私にとって最良のソリューションでした。
バングル氏2017

6

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

持っていた

<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

私の場合、アプリのbuild.gradleコンパイル 'com.android.support:appcompat-v7:21.0.3'を削除する必要がありました。

通知:私の最小SDK = 14であり、Android Studioによって作成されたプロジェクトは、私の不要な依存関係を挿入しました。

この置き換えの後、android:showAsAction = "always"と記述できます


ありがとうございます。4.0より前のAndroidバージョンをサポートする必要がないため、この日はほとんどの場合、おそらく最良のソリューションです。
pinyin_samu

あなたの答えとベイカーズは私にとって正しい解決策です。
はた

4

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

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

に変更する

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

問題を修正しました!


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とappcompatライブラリをxmlns:app = "http://schemas.android.com/apk/res-auto"で使用する必要がありますless ...(Ctrl + F1)

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

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

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


0

このようなカスタム名前空間を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

私はそれを交換することで解決しました

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

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

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>
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.