初次接触Android ActionBar比较烦人的问题

本文转自:http://blog.csdn.net/u010933209/article/details/40112079

问题一:icon不能正常显示

一直都对actionbar又爱又恨,特别是刚接触的时候有个十分头疼的问题,就是明明ShowAsAction没有设为never,怎么就是没显示?

后来对比了eclipse生成的menu和自己写的menu文件,发现eclipse生成的menu会多个命名空间 xmlns:app="http://schemas.android.com/apk/res-auto",而且eclipse自动生成的icon前缀则是app:icon,然后把自己定义item的icon前缀也改为app,果然可以正常显示了。

以下这段是Google Android 官方培训教程看到的:

 

如果你为了兼容 Android 2.1 的版本使用了 Support 库,在 android 命名空间下 showAsAction 属性是不可用的。Support 库会提供替代它的属性,你必须声明自己的 XML 命名空间,并且使用该命名空间作为属性前缀。(一个自定义 XML 命名空间需要以你的 app 名称为基础,但是可以取任何你想要的名称,它的作用域仅仅在你声明的文件之内。)例如:

res/menu/main_activity_actions.xml

<menu xmlns:android="http://schemas.android.com/apk/res/android"  
      xmlns:yourapp="http://schemas.android.com/apk/res-auto" >  
    <!-- Search, should appear as action button -->  
    <item android:id="@+id/action_search"  
          android:icon="@drawable/ic_action_search"  
          android:title="@string/action_search"  
          yourapp:showAsAction="ifRoom"  />  
    ...  
</menu>  

 

也就是说,如果你用了android.support.v7包,则icon属性前缀必须是自定义的命名空间前缀,icon才会正常显示。

 

问题二:overflow无法显示

对初学者来说又是一个比较抓狂的问题。抓破头都很难想出一个所以然来。

后来网上找资料才发现原来是跟手机硬件有关。如果你手机已经有物理menu键,overflow就不会显示。如果要显示就只能通过代码控制了。

private void setOverflowShowingAlways() {  
    try {  
        ViewConfiguration config = ViewConfiguration.get(this);  
        Field menuKeyField = ViewConfiguration.class.getDeclaredField("sHasPermanentMenuKey");  
        menuKeyField.setAccessible(true);  
        menuKeyField.setBoolean(config, false);  
    } catch (Exception e) {  
        e.printStackTrace();  
    } 

然后在onCreate方法中调用该方法 

没错,就是通过反射来改变overflow 的默认设置,让其无论有没有物理menu键都可以显示。

不得不吐槽这蛋疼的设计。

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。