Actionbar的基本用法以及Actionbar中menu里面的图标显示控制问题

添加Actionbar 一开始发现一个问题 到底是用ActionBarActivity还是普通的Activity。其实不用纠结什么,ActionBarActivity默认有个标题栏,创建activity的时候自动就有了,activity默认没有标题栏,但是你可以在代码中手动添加一个标题栏。

Actionbar位于传统标题栏的位置,也就是显示在屏幕的顶部。

Actionbar提供了如下功能:

1.显示选项菜单optionsMenu的菜单项(Action Item)。

2.使用程序图标作为返回Home主屏或向上的导航操作。

3.提供交互式View作为Action View。

4.提供基于Tab的导航方式,可用于切换多个Fragment。

5.提供基于下拉的导航方式。

接下来代码带注释进行说明。

//获取Actionbar实例

ActionBar actionBar = getActionBar();

// 是否显示应用程序图标,默认为true 

actionBar.setDisplayShowHomeEnabled(true); 

// 是否显示应用程序标题,默认为true

actionBar.setDisplayShowTitleEnabled(true); 

//是否将应用程序图标转变成可点击的按钮,默认为false。
actionBar.setHomeButtonEnabled(true); 
//在应用程序图标的左边显示一个向左的箭头,
actionBar.setDisplayHomeAsUpEnabled(true); 

//这里需要注意一点 如果设备有物理菜单按键,需要将其屏蔽才能显示OverflowMenu 代码如下 在对Actionbar进行基本配置后就可以设置了

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();

}

//对Actionbar进行配置 需要实现三个方法

//加载Actionbar显示的菜单

onCreateOptionsMenu(Menu menu);

//对于点击的菜单某一项的事件捕获

onOptionsItemSelected(MenuItem item)

//解决menu里面设置了图标而不显示的问题 在menu打开时有一个处理

onMenuOpened(int featureId, Menu menu)

//在创建菜单时候 很简单加载你创建的menu的xml文件

MenuInflater inflater = getMenuInflater();  

inflater.inflate(R.menu.actionbar_menu, menu); 

return super.onCreateOptionsMenu(menu);

这里解释一些menu的item的一些属性

<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    tools:context="com.example.myrecyclerview.MainActivity" >
<item
        android:id="@+id/main_delete"
        android:icon="@drawable/save"
        android:showAsAction="always"
        android:title="@string/menu_delete"/>
</menu>

主要是这个showAsAction这个属性showAsAction属性用来定义每个Action是如何显示的,always表示永远显示在ActionBar中,如果屏幕空间不够则无法显示,ifRoom表示屏幕空间够的情况下显示在ActionBar中,不够的话就显示在overflow中,never则表示永远显示在overflow中。

这里会遇到一个问题 显示在Actionbar中的action设置了图标不显示的问题 如果你的Activity继承的是v7包的Actionbar则需要以下操作才能显示

menu属性中加入 xmlns:app="http://schemas.android.com/apk/res-auto"

并将android:showAsAction 换成 app:showAsAction.

给actionbar添加了action之后需要监听这个action点击事件就需要实现onOptionsItemSelected(MenuItem item)方法

使用很简单 可以通过item.getitemId拿到对应action的id则可以监听到点击事件 如下代码

@Override  
        public boolean onOptionsItemSelected(MenuItem item) {  
            switch (item.getItemId()) {  
            /*
             * 将actionBar的HomeButtonEnabled设为ture,
             * 将会执行此case
             */  
            case android.R.id.home:  
                finish();  
                break;  
            case R.id.add:  
                Toast.makeText(this, "添加", Toast.LENGTH_LONG).show();  
                break;  
            // 其他省略...  
            default:  
                break;  
            }  
            return super.onOptionsItemSelected(item);  

        } 

实现onMenuOpened(int featureId, Menu menu)解决menu里面的图标不显示的问题则只需要在该方法里面实现如下代码即可:

@Override  
        public boolean onMenuOpened(int featureId, Menu menu) {  
           if (featureId == Window.FEATURE_ACTION_BAR && menu != null) {  
                if (menu.getClass().getSimpleName().equals("MenuBuilder")) {  
                    try {  
                        Method m = menu.getClass().getDeclaredMethod(  
                                "setOptionalIconsVisible", Boolean.TYPE);  
                        m.setAccessible(true);  
                        m.invoke(menu, true);  
                    } catch (Exception e) {  
                        Log.d("OverflowIconVisible", e.getMessage());  
                    }  
                }  
            }  
            return super.onMenuOpened(featureId, menu);  
        }



  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值