按道理,最有效最有问道的解决办法应该是下面这个。
原理是:菜单显示是根据public boolean hasPermanentMenuKey ()这个方法来判断的。这个方法是获取sHasPermanentMenuKey的boolean值。所以我们手动的设置这个值为false即可。
在有 menu按键的手机上面,ActionBar 上的 overflow menu 默认不会出现,只有当点击了 menu按键时才会显示。我们可以通过如下方法,强制让它显示出来。
- package com.example.example;
- import java.lang.reflect.Field;
- import com.example.android_bottomactionbar.R;
- import android.app.ActionBar;
- import android.app.Activity;
- import android.content.Intent;
- import android.os.Bundle;
- import android.view.Menu;
- import android.view.MenuItem;
- import android.view.ViewConfiguration;
- public class MoreActionBarActivity extends Activity {
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- // TODO Auto-generated method stub
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_more);
- forceShowActionBarOverflowMenu();
- ActionBar actionBar = getActionBar();
- actionBar.setDisplayHomeAsUpEnabled(true);
- }
- /**
- * 强制显示 overflow menu
- */
- private void forceShowActionBarOverflowMenu() {
- 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();
- }
- }
- @Override
- public boolean onCreateOptionsMenu(Menu menu) {
- getMenuInflater().inflate(R.menu.actionbar_menu_overflow, menu);
- return super.onCreateOptionsMenu(menu);
- }
- @Override
- public boolean onOptionsItemSelected(MenuItem item) {
- switch (item.getItemId()) {
- case android.R.id.home:
- // app icon in action bar clicked; go home
- Intent intent = new Intent(this, MainActivity.class);
- intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
- startActivity(intent);
- return true;
- default:
- return super.onOptionsItemSelected(item);
- }
- }
- }
actionbar_menu_overflow.xml
- <?xml version="1.0" encoding="utf-8"?>
- <menu xmlns:android="http://schemas.android.com/apk/res/android">
- <item
- android:id="@+id/menu_repost"
- android:icon="@android:drawable/ic_menu_edit"
- android:title="转发"
- android:showAsAction="always" />
- <item
- android:id="@+id/menu_comment"
- android:icon="@android:drawable/ic_menu_zoom"
- android:title="评论"
- android:showAsAction="always" />
- <item
- android:id="@+id/menu_refresh"
- android:icon="@android:drawable/ic_menu_rotate"
- android:title="刷新" />
- <item
- android:id="@+id/menu_fav"
- android:title="收藏"
- android:icon="@android:drawable/ic_menu_crop" />
- <item
- android:id="@+id/menu_share"
- android:title="分享"
- android:icon="@android:drawable/ic_menu_share"
- android:actionProviderClass="android.widget.ShareActionProvider" />
- <item
- android:id="@+id/menu_copy"
- android:title="复制"
- android:icon="@android:drawable/ic_menu_compass" />
- <item
- android:id="@+id/menu_delete"
- android:visible="false"
- android:title="删除" />
- </menu>
这样即使手机有menu 物理按键,overflow menu依然会显示出来
可惜我使用了这个方法还是无法一直显示overflow menu,还不清楚什么原因,而我使用这个菜单是想实现更多这种效果。不需要actionbar提供的自适配。
于是乎...
可以将菜单的xml设计成下面这种格式。就哦了。
<?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@+id/file" android:title="@string/file" >//这是主菜单 <!-- "file" submenu --> <menu> <item android:id="@+id/create_new" android:title="@string/create_new" />//这个 <item android:id="@+id/open" android:title="@string/open" />//和这个是主菜单下的两个子菜单。 </menu> </item> </menu>