web-dev-qa-db-ja.com

showAsAction = "ifRoom"は、十分なスペースがある場合でもアイテムを表示しません

私はアプリでActionBarを適切に動作させようとしています(そしてActionBarSherlockを使用してAndroid 2.xと4.xの間で統一されたUIを取得しています)。

のような気がする Android:showAsAction="ifRoom"は、ただの大きな嘘です。アクションをifRoomに設定するたびに、十分なスペースがあっても、常にオーバーフローメニューに表示されます。同じエミュレーターの2つのスクリーンショットを次に示します。最初は、すべてのオプションがalwaysに設定されたActionBarを示し、2番目は、最後の2つのオプションがifRoomに設定されたActionBarを示します。ご覧のとおり、alwaysスクリーンショットにすべて表示されたときに十分なスペースがありましたが、2番目にスペースがあるのになぜ2番目に表示されないのですか?

enter image description here

enter image description here

ここに私の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>
45
Kenny Wyland

私はパーティーに来るのに遅すぎないことを願っています。

それは本当に大きな嘘ではなく、小さな見落としです。

showAsAction属性は、異なる名前空間"http://schemas.Android.com/apk/res-auto"を使用して定義する必要があります

したがって、トップメニュータグで次のように名前空間を定義する必要がありますxmlns:app="http://schemas.Android.com/apk/res-auto"

そして、それを使用してshowAsAction属性を次のように定義しますapp:showAsAction="ifRoom"

それはそれを修正する必要があります

37
josagyemang

アクションバーに移動するアイテムの最大数が指定されており、4のように見えるためです。もちろん、showAsAction: alwaysただし、Google APIガイドに関しては:

メニュー項目のうち4つ以上をアクション項目として正当化できると思われる場合は、それらの相対的な重要度を慎重に検討し、アクション項目として4つ以下を設定する必要があります(「ifRoom」値を使用して小さい画面でスペースが限られている場合、システムがオーバーフローメニューに戻ることができるようにします)。ワイドスクリーンでスペースが利用できる場合でも、UIを乱雑にしてデスクトップツールバーのように見えるアクションアイテムの長いストリームを作成しないでください。アクションアイテムの数は最小限に抑えてください。

また、設定、ヘルプ、フィードバックなどのアクションがアクションアイテムとして表示されることはありません。常にオーバーフローメニューに保存してください。

13
Michał Z.

Michal Zからの回答を補完するために:Android Design Guide Page Patterns-> Actionbarは、「Action Buttons」の章で次のように述べています。

http://developer.Android.com/design/patterns/actionbar.html

メインアクションバーにはいくつのアクションが収まりますか?アクションバーの容量は、次のルールによって制御されます。

  • メインアクションバーのアクションボタンは、バーの幅の50%以上を占めることはできません
  • 下部のアクションバーのアクションボタンは、幅全体を使用できます。
  • 密度に依存しないピクセル(dp)の画面幅により、メインアクションバーに収まるアイテムの数が決まります。
    • 360 dp = 2アイコンより小さい
    • 360-499 dp = 3アイコン
    • 500-599 dp = 4アイコン
    • 600 dp以上= 5アイコン
10
arne.jans

つかいます app:showAsAction="always" の代わりに Android:showAsAction="always"

4
Rahul_Pawar

つかいます

<menu xmlns:Android="http://schemas.Android.com/apk/res/Android" xmlns:yourapp="http://schemas.Android.com/apk/res-auto" >
2
Ravi Karki

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の独自のビューを作成する必要があります。

0
ivan

以下のコードを使用して、常に動作します

<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>
0
Creator