现在的位置: 首页 > 综合 > 正文

关于actionbar overflow menu(溢出菜单)不显示的解决办法

2018年08月02日 ⁄ 综合 ⁄ 共 4082字 ⁄ 字号 评论关闭

按道理,最有效最有问道的解决办法应该是下面这个。

原理是:菜单显示是根据public boolean hasPermanentMenuKey ()这个方法来判断的。这个方法是获取sHasPermanentMenuKey的boolean值。所以我们手动的设置这个值为false即可。

在有 menu按键的手机上面,ActionBar 上的 overflow menu 默认不会出现,只有当点击了 menu按键时才会显示。我们可以通过如下方法,强制让它显示出来。

[java] view
plain
copy

  1. package com.example.example;  
  2.   
  3. import java.lang.reflect.Field;  
  4. import com.example.android_bottomactionbar.R;  
  5. import android.app.ActionBar;  
  6. import android.app.Activity;  
  7. import android.content.Intent;  
  8. import android.os.Bundle;  
  9. import android.view.Menu;  
  10. import android.view.MenuItem;  
  11. import android.view.ViewConfiguration;  
  12.   
  13. public class MoreActionBarActivity extends Activity {  
  14.   
  15.     @Override  
  16.     protected void onCreate(Bundle savedInstanceState) {  
  17.         // TODO Auto-generated method stub  
  18.         super.onCreate(savedInstanceState);  
  19.         setContentView(R.layout.activity_more);  
  20.           
  21.         forceShowActionBarOverflowMenu();  
  22.           
  23.         ActionBar actionBar = getActionBar();  
  24.         actionBar.setDisplayHomeAsUpEnabled(true);  
  25.     }  
  26.       
  27.     /** 
  28.      * 强制显示 overflow menu 
  29.      */  
  30.     private void forceShowActionBarOverflowMenu() {  
  31.         try {  
  32.             ViewConfiguration config = ViewConfiguration.get(this);  
  33.             Field menuKeyField = ViewConfiguration.class.getDeclaredField("sHasPermanentMenuKey");  
  34.             if (menuKeyField != null) {  
  35.                 menuKeyField.setAccessible(true);  
  36.                 menuKeyField.setBoolean(config, false);  
  37.             }  
  38.         } catch (Exception e) {  
  39.             e.printStackTrace();  
  40.         }  
  41.     }  
  42.       
  43.     @Override  
  44.     public boolean onCreateOptionsMenu(Menu menu) {  
  45.         getMenuInflater().inflate(R.menu.actionbar_menu_overflow, menu);  
  46.         return super.onCreateOptionsMenu(menu);  
  47.     }  
  48.       
  49.     @Override  
  50.     public boolean onOptionsItemSelected(MenuItem item) {  
  51.         switch (item.getItemId()) {  
  52.         case android.R.id.home:  
  53.             // app icon in action bar clicked; go home  
  54.             Intent intent = new Intent(this, MainActivity.class);  
  55.             intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);  
  56.             startActivity(intent);  
  57.             return true;  
  58.           
  59.         default:  
  60.             return super.onOptionsItemSelected(item);  
  61.         }  
  62.     }  
  63. }  




actionbar_menu_overflow.xml

[html] view
plain
copy

  1. <?xml version="1.0" encoding="utf-8"?>  
  2.   
  3. <menu xmlns:android="http://schemas.android.com/apk/res/android">  
  4.   
  5.     <item  
  6.         android:id="@+id/menu_repost"  
  7.         android:icon="@android:drawable/ic_menu_edit"  
  8.         android:title="转发"  
  9.         android:showAsAction="always" />  
  10.   
  11.   
  12.     <item  
  13.         android:id="@+id/menu_comment"  
  14.         android:icon="@android:drawable/ic_menu_zoom"  
  15.         android:title="评论"  
  16.         android:showAsAction="always" />  
  17.   
  18.     <item  
  19.         android:id="@+id/menu_refresh"  
  20.         android:icon="@android:drawable/ic_menu_rotate"  
  21.         android:title="刷新" />  
  22.   
  23.   
  24.     <item  
  25.         android:id="@+id/menu_fav"  
  26.         android:title="收藏"  
  27.         android:icon="@android:drawable/ic_menu_crop" />  
  28.   
  29.     <item  
  30.         android:id="@+id/menu_share"  
  31.         android:title="分享"  
  32.         android:icon="@android:drawable/ic_menu_share"  
  33.         android:actionProviderClass="android.widget.ShareActionProvider" />  
  34.   
  35.   
  36.     <item  
  37.         android:id="@+id/menu_copy"  
  38.         android:title="复制"  
  39.         android:icon="@android:drawable/ic_menu_compass" />  
  40.   
  41.     <item  
  42.         android:id="@+id/menu_delete"  
  43.         android:visible="false"  
  44.         android:title="删除" />  
  45.   
  46. </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>

先粗略写到着,后期再细化。

抱歉!评论已关闭.