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で同様のコードを使用しています。
おそらく、必要な名前空間がありません:
<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名前空間はアプリ名に基づいている必要がありますが、任意の名前にすることができ、宣言したファイルのスコープ内でのみアクセスできます。)
自分で考え出した。サポートライブラリ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>
また、ActionBarActivity.onCreateOptionsMenu()メソッドで正しいインフレータを使用していることを確認してください。
正しい解決策:
MenuInflater menuInflater = getMenuInflater();
menuInflater.inflate(R.menu.menu_example, menu);
間違った解決策:
MenuInflater menuInflater = new MenuInflater(this);
menuInflater.inflate(R.menu.menu_example, menu);
フラグメントの場合
カスタム名前空間を持つメニューはprevent showAsActionの表示を防ぎます。
Android Studioが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フラグメントを使用しており、違いが生じた場合に備えています。
同じ問題が発生しましたが、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);
}
}
私の場合、アプリのbuild.gradle compile 'com.Android.support:appcompat-v7:21.0.3'から削除する必要がありました。
注意:最小SDK = 14で、Android studioによってプロジェクトが作成され、不要な依存関係が挿入されました。
この置換の後、Android:showAsAction = "always"と書くことができます。
また、名前空間の正しいパスがあることを確認してください。間違っていてもエラーメッセージは表示されません。
持っていた
<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の部分をどうやって忘れたのかわかりませんが、それは起こりました。エラーメッセージはなく、追跡が困難なバグです。
これはあなたの場合ではないかもしれませんが、私は使っていました
new MenuInflater(this).inflate(R.menu.my_menu, menu);
に変更する
getMenuInflater().inflate(R.menu.my_menu, menu);
問題を修正しました!
最も簡単な方法は、次を追加してコードを変更することです
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>
交換して解決しました
Android:showAsAction="ifRoom"
と
app:showAsAction="ifRoom"
menuitme xmlは次のようになります。
<item Android:id="@+id/action_refresh"
Android:title="Refresh"
Android:icon="@drawable/refresh2"
app:showAsAction="ifRoom" />
最も簡単な方法は次のとおりです。
<?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>
このようなカスタム名前空間を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" />
<?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属性を使用する必要があります。
警告は無視できると思います。