web-dev-qa-db-ja.com

Android 3つのドットとしてのアクションバー項目

メインアクティビティのメニュー(res/menu/main_menu.xml)があり、アクションバーに1つのアイテムのみを配置し、残りは3つのドットメニューの下に非表示にします。 Three dots menu

問題は、アクションバーに3つのドットが表示されないことです。なぜ3つのドットアイテムが表示されないのですか?アイテムをその下に強制的に隠す方法は?

注:minSdkVersion = "14"を使用し、AVDでテストします。

18
Mustafa Chelik
<?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/menu_item_share"
        Android:title="@string/share"
        Android:icon="@Android:drawable/ic_menu_share"
        app:showAsAction="ifRoom"
        Android:actionProviderClass="Android.widget.ShareActionProvider" />

    <item
        Android:id="@+id/empty"
        Android:title="@string/options"
        Android:orderInCategory="101"
        app:showAsAction="always"
        Android:icon="@drawable/baseline_more_vert_black">

        <menu>

            <item Android:id="@+id/action_settings"
                Android:icon="@Android:drawable/ic_menu_preferences"
                app:showAsAction="ifRoom"
                Android:title="@string/settings" />

            <item Android:id="@+id/action_help"
                Android:icon="@Android:drawable/ic_menu_help"
                app:showAsAction="ifRoom"
                Android:title="@string/help" />

        </menu>

    </item>

</menu>

here からダウンロードしたら、baseline_more_vert_blackアイコンをres/drawable...フォルダーに追加する必要があります。

31

これを試して;

menu.xml

<?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/menu_new_content_facebook"
        Android:orderInCategory="100"
        Android:title="@string/str_share_facebook"
        app:showAsAction="never" />

    <item
        Android:id="@+id/menu_new_content_Twitter"
        Android:orderInCategory="200"
        Android:title="@string/str_share_Twitter"
        app:showAsAction="never" />
</menu>

MainActivity.Java

 @Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.menu, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    int id = item.getItemId();
    if(id == R.id.menu_new_content_Twitter){
        // do something
    }
    return super.onOptionsItemSelected(item);
}
8
alicanozkara

ban-geoengineeringが提供するこのソリューションは非常に興味深いものです... Android:showAsAction namespace Android:のようなカスタムネームスペースを使用すると、3ドットアイコンが表示されないことがあります。

<menu xmlns:Android="http://schemas.Android.com/apk/res/Android"
 xmlns:app="http://schemas.Android.com/apk/res-auto">
<item
    Android:id="@+id/taskNotificationsBtn"
    app:showAsAction="always"
    Android:icon="@drawable/tasks"/>

しかし、ban-geoengineeringが提供するソリューションは、これをアラビア語のレイアウトに一致させるためにActionBarアイテムの方向を逆にする問題を解決するのに役立ちます。私はActionBarRTLizerライブラリと標準的なアプローチを使用しましたAndroid os 3dotsはメニュー項目アイコンが時々お互いをカバーするときにいくつかのバグを引き起こします(非常に苛立たしい状況)が、このカスタムソリューション

<item
    Android:id="@+id/empty"
    Android:title="@string/options"
    Android:orderInCategory="101"
    Android:showAsAction="always"
    Android:icon="@drawable/ic_action_overflow">

    <menu>

        <item Android:id="@+id/action_settings"
            Android:icon="@Android:drawable/ic_menu_preferences"
            Android:showAsAction="ifRoom"
            Android:title="@string/settings" />

        <item Android:id="@+id/action_help"
            Android:icon="@Android:drawable/ic_menu_help"
            Android:showAsAction="ifRoom"
            Android:title="@string/help" />

    </menu>

</item>

問題は解決し、RTLは完全に機能します! :)

これは、ハードウェアメニューボタンを処理する場合にも役立ちます。

@Override
public boolean onKeyUp(int keyCode, KeyEvent event) {
   if (keyCode == KeyEvent.KEYCODE_MENU) {
     // do stuff
     return true;
   } else {
     return super.onKeyUp(keyCode, event);
   }
}

ここに追加:mMenuReference.performIdentifierAction(R.id.menu_0、1);

たとえば、現在のアクティビティに応じてオーバーフローメニューとして表示されるサブメニューを置き換えるには、このソリューションを使用できます。

 public boolean onCreateOptionsMenu(Menu menu) {
      // Inflate your main_menu into the menu
      getMenuInflater().inflate(R.menu.main_menu, menu);

      // Find the menuItem to add your SubMenu
      MenuItem myMenuItem = menu.findItem(R.id.my_menu_item);

      // Inflating the sub_menu menu this way, will add its menu items 
      // to the empty SubMenu you created in the xml
      getMenuInflater().inflate(R.menu.sub_menu, myMenuItem.getSubMenu());

   }
5
Michał Ziobro

なぜ3つのドットアイテムが表示されないのですか?

エミュレータは、MENUボタンがあるデバイスをエミュレートしています。デバイスにMENUボタンがある場合、MENUボタンを押すとオーバーフローが発生します。

2
CommonsWare

解決策はここにあります https://stackoverflow.com/a/27502405/1808829 、これは私にとって完璧に機能しました。 xmlスタッフと作業する必要はありません。プログラムでのみ行われます。

private void getOverflowMenu() {

         try {
            ViewConfiguration config = ViewConfiguration.get(this);
            Field menuKeyField = ViewConfiguration.class.getDeclaredField("sHasPermanentMenuKey");
            if(menuKeyField != null) {
                menuKeyField.setAccessible(true);
                menuKeyField.setBoolean(config, false);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
0
Ayaz Alifov