2

Galaxy S3 で、ActionBar のボタンが showAsAction="always" として構成され、ハードウェア オーバーフロー メニューとアクション ボタンの両方に表示されるという問題があります。ハードウェア オーバーフロー メニューには表示せず、アクション ボタンにのみ表示したいと思います。onCreateOptionsMenu でメニュー項目を無効にできますが、両方の場所でボタンが非表示になります。

注意点: 「3 つのドット」アクション オーバーフロー メニューを強制的に表示すると、更新ボタンがハードウェア オーバーフロー メニューから適切に非表示になりますが、ハードウェア オーバーフロー メニューからは非表示になりません。

他に注意すべき点: onCreateOptionsMenu または onPrepareOptionsMenu のいずれかで menu.size() を呼び出すと、余分なボタンが反映されません。たとえば、4 つのボタンがあり、最初のボタンがアクション ボタンとオーバーフロー メニューの両方に表示されているとします。menu.size() はまだ 4 を返し、余分なボタンが表示されていることを認識していないようです。

これはクライアント向けのアプリであるため、スクリーンショットを投稿できませんが、ここに私の actionbar.xml ファイルがあります。更新ボタンは、上部のオーバーフローとアクション バーの両方に表示されます。

actionbar.xml

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
    <item android:id="@+id/refreshmenuitem"
          android:icon="@drawable/refreshicon"
          android:title="Refresh"
          android:showAsAction="ifRoom" 
          android:visible="true"
          android:layout_width="match_parent"
          android:layout_height="match_parent"
          />
    <item android:id="@+id/helpbutton"
        android:title="Help"
        android:showAsAction="collapseActionView"
        android:icon="@drawable/ic_action_helpbutton" />
    <item android:id="@+id/settingbutton"
        android:title="Settings"
        android:icon="@drawable/ic_action_settingbutton"
        android:showAsAction="collapseActionView" />
    <item android:id="@+id/importbutton"
        android:title="Import file"
        android:icon="@drawable/ic_action_importbutton"
        android:showAsAction="collapseActionView" />
</menu>
4

3 に答える 3

2

だから私はそれを理解しましたが、それは一種のハックです。そのため、Samsung Galaxy S3 などのハードウェア メニュー ボタンを備えた電話を使用している場合、onCreateOptionsMenu 関数は実際には 2 回呼び出されます。アクティビティがロードされて右上に表示されるメニュー項目をロードするときと、ユーザーがハードウェア メニュー ボタンを押したときに 1 回。私がしたことは、_firstTimeOnCreateOptionsMenu という変数を作成することだけでした。これは、初めて onCreateOptionsMenu メソッドになった後に false に設定されます。

    public boolean onCreateOptionsMenu(Menu menu)
    {
        // Populates the actionbar/Menu
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.actionbarmenu, menu);
        boolean hardware = false;

        if(android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.ICE_CREAM_SANDWICH)
        {
            hardware = ViewConfiguration.get(context).hasPermanentMenuKey();
        }

        MenuItem b1 = menu.findItem(R.id.refreshmenuitem);

        if(!hardware || _firstTimeOnCreateOptionsMenu)
        {
            b1.setVisible(true);
            _firstTimeOnCreateOptionsMenu = false;
        }
        else
        {
            b1.setVisible(false);
            _firstTimeOnCreateOptionsMenu = true;
        }
    }

うまくいけば、これはこの問題を抱えている他の人の助けになります。

于 2013-01-08T21:25:31.720 に答える
0

不明な XML は単に無視されると予想されるため、これが問題だった場合は少し驚かれることでしょうが、ドキュメント によると、 and<item>はサポートされていません。android:layout_widthandroid:layout_height

于 2013-01-07T23:31:39.070 に答える
0

targetSdkVersion は 14 に設定されていますか?

http://android-developers.blogspot.com/2012/01/say-goodbye-to-menu-button.html

于 2013-01-07T18:30:44.580 に答える