Android Actionbar items as three dots
我有一个用于主要活动的菜单(res / menu / main_menu.xml),我只希望操作栏上有一个项目,其余项目应隐藏在三个点菜单下。
问题是,我在操作栏上从未看到三个点。为什么看不到三个点的项目?如何强制将物品隐藏在其下?
注意:我使用minSdkVersion = " 14 "并在AVD中进行测试。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | <?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> |
从此处下载
尝试;
menu.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | <?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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | @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); } |
ban-geoengineering提供的这一解决方案非常引人入胜...
如果您使用android:showAsAction,则有时不显示3点图标
命名空间android:而是自定义命名空间,例如:
1 2 3 4 5 6 | <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一起使用,有时菜单项图标有时会相互覆盖(非常令人沮丧),但会导致一些错误,但是此自定义解决方案
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | <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完美运行! :)
如果您要处理硬件菜单按钮,这也可能会有所帮助:
1 2 3 4 5 6 7 8 9 | @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);
为了替换显示为溢出菜单的子菜单(例如,根据当前活动),您可以使用以下解决方案:
1 2 3 4 5 6 7 8 9 10 11 12 | 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()); } |
Why I can't see three dots item?
您的仿真器正在仿真具有MENU按钮的设备。如果设备上有一个MENU按钮,则MENU按钮将引发溢出。
可以在这里找到解决方案https://stackoverflow.com/a/27502405/1808829,它对我来说很完美。无需与xml人员一起工作,只需编程即可完成。
1 2 3 4 5 6 7 8 9 10 11 12 13 | 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(); } } |