笔记57--ActionBar一

转自郭大神,稍加更改:http://blog.csdn.net/guolin_blog/article/details/18234477

一、ActionBar是什么

是一种新增的导航栏按钮,在Android3.0之后加入,它标识了用户当前操作界面的位置,并提供了额外的用户动作、界面导航等操作。


[1]是ActionBar,[2]是两个action按钮,[3]是overflow按钮

二、用在哪

先说说优点:UI布局统一,使用起来无代沟,并且ActionBar还可以自动适配不同屏幕。所以,想实现这个特点就用ActionBar。

三、怎么用

在2.x版本中用需导包:Support Library

1、添加和删除ActionBar

添加:只需在AndroidMainfest.xml中指定Application或Activity的theme是Theme.Holo或其子类就可。创建新项目时默认已设置。

删除:三种方式:1)将theme指定为Theme.Holo.NoActionBar。2)ActionBar actionBar=getActionBar(); actionBar.hide();3)删除java文件中的onCreateOptionsMenu()。

2、修改ActionBar的图标和标题

修改图标:默认,系统使用<application>或<activity>中icon或logo属性指定的图片来作为ActionBar的图标,更改即可。

修改标题:修改同上位置的label属性。

3、添加action按钮

当Activity启动的时候,系统会调用Activity的onCreateOptionsMenu()方法加载布局文件中定义的按钮。所以,只需在布局文件中添加Action定义即可增加Action按钮。

<menu xmlns:android="http://schemas.android.com/apk/res/android" >


    <item
        android:id="@+id/action_settings"
        android:icon="@drawable/aaa"
        android:orderInCategory="100"
        android:showAsAction="never"
        android:title="@string/action_settings"/>
    <item
        android:id="@+id/action_delete"
        android:icon="@drawable/aaa"<span style="white-space:pre">				
        android:orderInCategory="100"<span style="white-space:pre">				
        android:showAsAction="always"<span style="white-space:pre">				
        android:title="@string/action_delete"/><span style="white-space:pre">				
    <item
        android:id="@+id/action_add"
        android:orderInCategory="100"
        android:showAsAction="never"
        android:icon="@drawable/aaa"
        android:title="@string/action_delete"/>


</menu>

title:指定该按钮显示的文字。(有图标时,通常不会显示文字;长按时会以toast方式显示文字)
orderIncategory:每个action按钮的优先级。值越大优先级越低,地方不够就会被放到overflow中。
showAsAction:三个值。never:永远显示在overflow中;ifRoom:屏幕空间足够时显示在ActionBar中,不够时显示在overflow中;always:永远显示在ActionBar中。

4、响应Action按钮的点击事件

点击事件的响应方法:onOptionsItemSelected()。通过传入的参数MenuItem.getItemId()来区分action按钮。

5、通过ActionBar图标进行导航

比如A界面跳到B界面,B界面又跳到C界面,此时想直接返回A界面,即可通过ActionBar来实现。三步实现:

1)给当前页面加入A界面的ActionBar。在onCreate函数中加入代码:

setTitle("天气");
setContentView(R.layout.enter);
ActionBar ab=getActionBar();
ab.setDisplayHomeAsUpEnabled(true);
2)在AndroidMainfest.xml中配置父activity。

6、添加Action View

ActionView是一种可以在ActionBar中替换Action按钮的控件。它可以允许用户在不切换界面的情况下通过ActionBar完成一些较为丰富的操作。比如,你需要完成一个搜索功能,就可以将SearchView这个控件添加到ActionBar中。为了声明一个ActionView,可在menu资源中通过actionViewClass属性指定一个控件。例如:


注意在showAsAction属性中我们还声明了一个collapseActionView,这个值表示该控件可以被合并成一个Action按钮。点击搜索前和后的效果图:


如果还希望在代码中对SearchView的属性进行配置(比如监听事件),只需在onCreateOptionsMenu()方法中获取该ActionView的实例即可。

SearchView searchView = (SearchView) searchItem.getActionView();  
// 配置SearchView的属性  
SearchView更多用法,参考: http://developer.android.com/guide/topics/search/search-dialog.html

除此之外,有些程序还希望能在ActionView展开和合并的时候显示不同的界面。只需注册一个ActionView的监听器即可。MenuItem.setOnActionExpandListener()和MenuItem.setOnActionCollapseListener().

7、Overflow不显示的情况

如果手机没有物理menu键,overflow就显示;否则就不显示。不显示时,按下menu键,隐藏的内容就会从底部显示出来。

解决办法:在ViewConfiguration这个类中有一个叫做sHasPermanentKey的静态变量,系统就是根据这个变量的值来判断手机有没有物理Menu键的。这是一个内部变量,无法直接访问,可通过反射的方式修改它的值,让它永远为false就行了。

protected void onCreate(Bundle savedInstanceState) {  
    ......  
    setOverflowShowingAlways();  
}  
  
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();  
    }  
}  

setOverflowShowingAlways()内部使用反射方式将sHasPermanentMenuKey的值设为false。

8、让Overflow中的选项显示图标

Overflow中的Action按钮显示不显示图标,是由MenuBuilder这个类的setOptionallconsVisible()来决定的,如果我们再Overflow被展开的时候给这个方法传入true,那么里面的每个Action按钮对应的图标就都会显示出来了。调用的方法仍然是反射了。

@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) {  
            }  
        }  
    }  
    return super.onMenuOpened(featureId, menu);  
}  

当Overflow被展开的时候,会调用onMenuOpened()。接着这个方法的内部通过返回反射的方法将MenuBuilder的setOptionallconsVisible变量设为true即可。










  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值