ActionBar使用

大家都知道Android的ActionBar是在3.0以上才有的,那么在3.0以下呢,google并没有给我提供在3.0以下支持ActionBar的包,但是外国的大牛JakeWharton实现了在3.0以下使用ActionBar,ActionBarSherlock是让Action Bar功能支持2.X后的所有平台,而且他会自动的判断是调用原生Action Bar还是使用扩展ActionBar,很多知名的应用也使用这个库

ActionBar以前已经介绍了一些,是在Android 3.0(API 11)引入的,你可以认为是一个导航条,代替了原来Activtiy的标题栏。

ActionBar提供一个一致的框架,品牌化,导航,还有供操作的action

通过getActionBar()得到对象。

ActionBar的隐藏和显示方法: 

ActionBar actionBar = getActionBar();
// Hide the Action Bar 
actionBar.hide();
// Show the Action Bar 
actionBar.show();

一旦你移除了ActionBar,那么你不能在程序中获取了:getActionBar会返回Null。

actionBar.setDisplayShowTitleEnabled(false); //隐藏标题栏(标签label)
actionBar.setDisplayShowHomeEnabled(false);//隐藏图标

等价于:

actionBar.setDisplayOptions(0,ActionBar.DISPLAY_SHOW_HOME|ActionBar.DISPLAY_SHOW_TITLE );


1.普通ActionBar

创建方式与Menu(xml创建)一样,不过item中需要设定android:showAsAction属性,不设定就是默认never,item将为menu的item,选择always或者ifRoom将为ActionBar。

右上角为ActionBar增加的item。默认不显示title,只有在showAsAction属性中设置了withText属性才会在横屏时显示。

如何修改logo旁的标题呢?使用setTitle和setSubTitle。一个主标题,一个子标题。

actionBar.setSubtitle(“Inbox”); 
actionBar.setTitle(“Label:important”);

image


自定义背景

默认的ActionBar的背景颜色取决于activity指定的Theme。Holo Theme它的背景是黑色的

你可以指定任意的Drawabel对象作为背景,使用setBackgroundDrawable方法:

ActionBar actionBar = getActionBar(); 
Resources r = getResources();
Drawable myDrawable = r.getDrawable(R.drawable.gradient_header);
actionBar.setBackgroundDrawable(myDrawable);
ActionBar会自动缩放你的背景图,所以通常好的方式,你的背景图最好是.9图。

覆盖模式

默认情况下,actionBar放在你的activity的顶部,且作为activity布局的一部分。设置成为覆盖模式后,actionBar相当于漂浮在activity之上,不干预activity的布局。

设置: getWindow().requestFeature(Window.FEATURE_ACTION_BAR_OVERLAY);(放在setContentView前)

Splite ActionBar模式

这个模式就是,你顶部放不下的action,我帮忙放在底部。

<activity 
   android:label=”My Activity” 
   android:name=”.ActionBarActivity” 
   android:logo=”@drawable/ic_launcher” 
   android:uiOptions=”splitActionBarWhenNarrow”>

自定义ActionBar去控制APP导航行为

Android提供了一系列方法,总的来说分为2类:

1.App icons 使用icon或者logo导航,典型的导航到APP的主界面。你也可以配置Icon去代表移动到上一级的意思。

2.Tabs和下拉列表 ActionBar支持内嵌的Tabs和下拉列表。

Icon导航可以用来导航Activity栈,然而Tabs和下拉列表被用来作为Activity内Fragments的转换。

配置ActionBar的Icon导航行为

在大多数情况,APP的icon应该被作为快捷方式,导航到主Activtiy,典型的说也就是Activtiy栈的根。为了使你的APP icon可以被点击,你必须调用ActionBar的setHomeButtonEnabled方法。

点击icon会被系统作为一个特殊的Menu Item的点击。所以你就可以在onOptionsItemSelected方法中去监听,它的id为android.R.id.home

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
  switch (item.getItemId()) { 
     case (android.R.id.home) : 
       Intent intent = new Intent(this, ActionBarActivity.class); 
       intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
       startActivity(intent); 
       return true; 
     default: 
       return super.onOptionsItemSelected(item); 
  } 
}

支持向上导航

传统的,Android APP在activity之间跳转完之后,可以使用返回按钮回退。

为了也支持这种模式,你可以配置app icon去提供“向上”导航。 
actionBar.setDisplayUseLogoEnabled(false); 
actionBar.setDisplayHomeAsUpEnabled(true); 
当向上导航的时候,通常使用icon而不是logo,所以这里setDisplayUseLogoEnabled(false)。

不得不说的一点:向上导航在样子上就多了个箭头,跟setHomeButtonEnabled本质上相同,都会被作为特殊的MenuItem,id都是android.R.id.home,也同样都需要在onOptionsItemSelected去监听,然后跳转。

具体怎么用,仁者见仁,智者见智。

2.Tab 类型ActionBar

ActionBar提供导航TAB和下拉列表。值得注意的是,一次只能激活其中的一种导航。这些导航选择项被设计用来与Fragments更亲近。通过替换可见的Fragments从而达到修改Activity内容的目的。

导航TAB是TabWidget的替代品。

image

如何配置TABS呢? 答:调用setNavigationMode方法,指定ActionBar.NAVIGATION_MODE_TABS

actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); 
actionBar.setDisplayShowTitleEnabled(false);

通常使用TAB也会去隐藏标题。

Tab tabOne = actionBar.newTab();

tabOne.setText(“First Tab”) 
       .setIcon(R.drawable.ic_launcher) 
       .setContentDescription(“Tab the First”) 
       .setTabListener( 
           new TabListener<MyFragment> 
              (this, R.id.fragmentContainer, MyFragment.class));

actionBar.addTab(tabOne);

此外,你还可以使用setCustomView方法,自定义Tab布局,代替标准的文字+图片模式。

注意:setContentDescription方法是在Android 4.0(API 14)引入的,用来提供更细节的描述。

Tab的转换是由TabListener来操控的,当tab被选择、未选择、重新选择时,允许你创建Fragment事务作为回应。

public static class TabListener<T extends Fragment> 
  implements ActionBar.TabListener {

   private MyFragment fragment; 
   private Activity activity; 
   private Class<T> fragmentClass;

   private int fragmentContainer;

   public TabListener(Activity activity, int fragmentContainer, 
                                     Class<T> fragmentClass) {

        this.activity = activity;  
        this.fragmentContainer = fragmentContainer;  
        this.fragmentClass = fragmentClass;  
    }

   // Called when a new tab has been selected  
   public void onTabSelected(Tab tab, FragmentTransaction ft) {  
     if (fragment == null) {  
        String fragmentName = fragmentClass.getName();  
         fragment =  
           (MyFragment)Fragment.instantiate(activity, fragmentName);  
        ft.add(fragmentContainer, fragment, null);  
        fragment.setFragmentText(tab.getText());  
    } else {  
         ft.attach(fragment);  
    } 
  }

// Called on the currently selected tab when a different tag is 
// selected. 
public void onTabUnselected(Tab tab, FragmentTransaction ft) { 
     if (fragment != null) {  
       ft.detach(fragment);  
     }  
}

    // Called when the selected tab is selected.  
   public void onTabReselected(Tab tab, FragmentTransaction ft) {  
       // TODO React to a selected tab being selected again.  
    } 
}

使用下拉列表导航

image

如何去配置呢?答:actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST)。

这里的下拉列表就像一个Spinner。数据源+Adapter+…..很简单!
// Select the drop-down navigation mode. 
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);

// Create a new Spinner Adapter that contains the values to 
// be displayed in the drop down. 
ArrayAdapter dropDownAdapter = 
  ArrayAdapter.createFromResource(this, 
                                         R.array.my_dropdown_values, 
                                         android.R.layout.simple_list_item_1);

// Assign the callbacks to handle drop-down selections. 
actionBar.setListNavigationCallbacks(dropDownAdapter, 
  new OnNavigationListener() { 
    public boolean onNavigationItemSelected(int itemPosition, 
                                                     long itemId) { 
    // TODO Modify your UI based on the position 
    // of the drop down item selected. 
    return true; 
  } 
});


3.显示在底部的ActionBar

    在AndroidManifest里的Activity加上属性android:uiOptions="splitActionBarWhenNarrow"后,普通ActionBar将不再显示在标题栏部分,而是显示在屏幕底部


使用自定义的自定义的导航View

Android允许你创建自己的导航View:

actionBar.setDisplayShowCustomEnabled(true); 
actionBar.setCustomView(R.layout.my_custom_navigation);


移除action bar

如果不想让某个activity显示action bar,则可以把该activity的主题设置为 Theme.Holo.NoActionBar。比如:

<activity android:theme="@android:style/Theme.Holo.NoActionBar">

当action bar隐藏后,系统会调整activity layout,以填满屏幕的全部可用空间。你可以用 show() 重新开启action bar。

请小心,隐藏并移除action bar会导致你的activity布局进行重新调整,因为要计算action bar所占用的屏幕空间。 如果你的activity经常要隐藏和显示action bar(类似Android的图库Gallery应用),则你也许需要使用覆盖(overlay)模式。 覆盖模式会在你的activity layout表层绘制action bar,而不是在屏幕上。这样,隐藏及重新显示action bar时,你的layout就可以保持固定的大小。 要启用覆盖模式,为你的activity创建一个主题并设置 android:windowActionBarOverlay 为true即可。

提示: 如果你自定义了一个移除action bar的activity主题,请设置  android:windowActionBar  样式属性为 false 。不过,如果你使用主题来移除了action bar,那么窗口就会完全禁用action bar,因此你就再也无法添加它了——调用  getActionBar()  将返回null。

我们使用ActionBarSherlock的时候不再是继承Activity,而是继承SherlockActivity,SherlockDialogFragment,SherlockFragmentActivity等等,我这里用到Fragment,所以继承SherlockFragmentActivity,我们不能随便设置Activity的theme,以后我们要全屏显示的时候直接设置android:theme="@android:style/Theme.Black.NoTitleBar"

,我们使用ActionBar就不能这样设置了,并且不能随便设置他的Theme,必须是Theme.Sherlock, Theme.Sherlock.Light, Theme.Sherlock.Light.DarkActionBar,或者是他们的子样式,不然就会出java.lang.IllegalStateException异常,所以为了自定义ActionBar的Tab,我们必须修改其style

参考:http://blog.csdn.net/xiaanming/article/details/9971721

http://my.oschina.net/wangjunhe/blog/113525   





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值