私はアプリでActionBarを適切に動作させようとしています(そしてActionBarSherlockを使用してAndroid 2.xと4.xの間で統一されたUIを取得しています)。
のような気がする Android:showAsAction="ifRoom"
は、ただの大きな嘘です。アクションをifRoom
に設定するたびに、十分なスペースがあっても、常にオーバーフローメニューに表示されます。同じエミュレーターの2つのスクリーンショットを次に示します。最初は、すべてのオプションがalways
に設定されたActionBarを示し、2番目は、最後の2つのオプションがifRoom
に設定されたActionBarを示します。ご覧のとおり、always
スクリーンショットにすべて表示されたときに十分なスペースがありましたが、2番目にスペースがあるのになぜ2番目に表示されないのですか?
ここに私のmenu.xmlがあります:
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:Android="http://schemas.Android.com/apk/res/Android" >
<item
Android:id="@+id/add"
Android:icon="@drawable/ic_menu_btn_add"
Android:showAsAction="always"
Android:title="Add"/>
<item
Android:id="@+id/calculateNPV"
Android:icon="@drawable/menu_icon_npv"
Android:showAsAction="always"
Android:title="NPV"/>
<item
Android:id="@+id/calculateIRR"
Android:icon="@drawable/menu_icon_irr"
Android:showAsAction="always"
Android:title="IRR/YR"/>
<item
Android:id="@+id/send"
Android:icon="@Android:drawable/ic_menu_share"
Android:showAsAction="always"
Android:title="@string/share_pdf"/>
<item
Android:id="@+id/graph"
Android:icon="@drawable/ic_menu_gallery"
Android:showAsAction="ifRoom"
Android:title="@string/view_cashflow_diagram"/>
<item
Android:id="@+id/deleteReorder"
Android:icon="@drawable/ic_menu_clear_playlist"
Android:showAsAction="ifRoom"
Android:title="@string/delete_reorder_cashflows"/>
</menu>
私はパーティーに来るのに遅すぎないことを願っています。
それは本当に大きな嘘ではなく、小さな見落としです。
showAsAction
属性は、異なる名前空間"http://schemas.Android.com/apk/res-auto"
を使用して定義する必要があります
したがって、トップメニュータグで次のように名前空間を定義する必要がありますxmlns:app="http://schemas.Android.com/apk/res-auto"
そして、それを使用してshowAsAction属性を次のように定義しますapp:showAsAction="ifRoom"
それはそれを修正する必要があります
アクションバーに移動するアイテムの最大数が指定されており、4のように見えるためです。もちろん、showAsAction: always
ただし、Google APIガイドに関しては:
メニュー項目のうち4つ以上をアクション項目として正当化できると思われる場合は、それらの相対的な重要度を慎重に検討し、アクション項目として4つ以下を設定する必要があります(「ifRoom」値を使用して小さい画面でスペースが限られている場合、システムがオーバーフローメニューに戻ることができるようにします)。ワイドスクリーンでスペースが利用できる場合でも、UIを乱雑にしてデスクトップツールバーのように見えるアクションアイテムの長いストリームを作成しないでください。アクションアイテムの数は最小限に抑えてください。
また、設定、ヘルプ、フィードバックなどのアクションがアクションアイテムとして表示されることはありません。常にオーバーフローメニューに保存してください。
Michal Zからの回答を補完するために:Android Design Guide Page Patterns-> Actionbarは、「Action Buttons」の章で次のように述べています。
http://developer.Android.com/design/patterns/actionbar.html
メインアクションバーにはいくつのアクションが収まりますか?アクションバーの容量は、次のルールによって制御されます。
つかいます app:showAsAction="always"
の代わりに Android:showAsAction="always"
つかいます
<menu xmlns:Android="http://schemas.Android.com/apk/res/Android" xmlns:yourapp="http://schemas.Android.com/apk/res-auto" >
ActivityBar表示される要素の量を超えないようにします。そして、その制限はActivityBarが実際に含むことができるよりも低いです。制限はAndroid.support.v7.view.ActionBarPolicy classで設定されます:
`/**
* Returns the maximum number of action buttons that should be permitted within an action
* bar/action mode. This will be used to determine how many showAsAction="ifRoom" items can fit.
* "always" items can override this.
*/
public int getMaxActionButtons() {
final Resources res = mContext.getResources();
final int widthDp = ConfigurationHelper.getScreenWidthDp(res);
final int heightDp = ConfigurationHelper.getScreenHeightDp(res);
final int smallest = ConfigurationHelper.getSmallestScreenWidthDp(res);
if (smallest > 600 || widthDp > 600 || (widthDp > 960 && heightDp > 720)
|| (widthDp > 720 && heightDp > 960)) {
// For values-w600dp, values-sw600dp and values-xlarge.
return 5;
} else if (widthDp >= 500 || (widthDp > 640 && heightDp > 480)
|| (widthDp > 480 && heightDp > 640)) {
// For values-w500dp and values-large.
return 4;
} else if (widthDp >= 360) {
// For values-w360dp.
return 3;
} else {
return 2;
}
}`
ご覧のとおり、制限は2〜5で、画面の幅によって異なります。
この動作を変更する方法を見つけることができませんでした。したがって、制限を超えたい場合は、showAsAction = "always"を使用するか、ActionBarの独自のビューを作成する必要があります。
以下のコードを使用して、常に動作します
<menu
xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:app="http://schemas.Android.com/apk/res-auto"
xmlns:tools="http://schemas.Android.com/tools"
tools:context=".MainActivity">
<item
Android:id="@+id/menu_share"
Android:title="Share"
Android:orderInCategory="100"
app:showAsAction="ifRoom"
Android:actionProviderClass="Android.widget.ShareActionProvider"/>
</menu>