Android actionBar兼容版本的使用

来源:互联网 发布:宝鸡大数据产业园 编辑:程序博客网 时间:2024/04/28 05:22

          Action bar是一个标识应用程序和用户位置的窗口功能,并且给用户提供操作和导航模式。在大多数的情况下,当你需要突出展现用户行为或全局导航的activity中使用action bar,因为action bar能够使应用程序给用户提供一致的界面,并且系统能够很好根据不同的屏幕配置来适应操作栏的外观。你能够用ActionBar的对象的API来控制操作栏的行为和可见性,这些API被添加在Android3.0(API 级别 11)中。

  从Android3.0(API级别 11)开始,Action bar被包含在所有的使用Theme.Hole主题的Activity(或者是这些Activity的子类)中,当targetSdkVersion或minSdkVersion属性被设置为“11”或更大的数值是,这个主题是默认的主题一。如:

 Holo.Light.DarkActionBar 风格是黑色背景白色字体 对应最低版本是14

 

 <uses-sdk        android:minSdkVersion="4"        android:targetSdkVersion="18" 

android:Theme.Holo.Light 主题 对应版本11


</pre>最低版本是14以上的系统会自动到values-14包下找到相关主题,如果版本大于14的话,系统会直接找最大的,也就是values-14.    <p><span style="font-family:Arial;color:#333333;LINE-HEIGHT: 26px"><span style="font-size:18px;"></span></span><pre class="html" name="code" snippet_file_name="blog_20151119_3_6893304" code_snippet_id="443132"> android:theme="@style/AppBaseTheme"

  <!--        Base application theme for API 14+. This theme completely replaces        AppBaseTheme from BOTH res/values/styles.xml and        res/values-v11/styles.xml on API 14+ devices.    -->    <style name="AppBaseTheme" parent="android:Theme.Holo.Light.DarkActionBar">        <!-- API 14 theme customizations can go here. -->    </style>
 在清单文件中引用系统主题

 android:theme="@android:style/android:Theme.Holo.Light.DarkActionBar"


或者引用自定义主题:

 android:theme="@style/CustomActionBarTheme"

删除actionbar

<activity android:theme="@android:style/Theme.Holo.NoActionBar">
或者代码 把actionbar隐藏

ActionBar actionBar = getActionBar();  actionBar.hide();

首先介绍3.0以上系统actionbar的使用

菜单项

   <item        android:id="@+id/action_share"        android:actionProviderClass="android.widget.ShareActionProvider"        android:showAsAction="ifRoom"        android:title="@string/share"/>    <item        android:id="@+id/action_search"        android:icon="@drawable/ic_action_search"        android:showAsAction="ifRoom"        android:title="@string/search"/>    <item        android:id="@+id/action_setting"        android:showAsAction="never"        android:title="@string/setting"/>

showAsAction 模式介绍    never 不显示在菜单栏上,把item放在overflow里 (折叠菜单)

,ifRoom如果有空间就显示,没空间就放在overflow。

,withText 菜单项和它的图标,菜单文本一起显示。

,collapseActionView, 让操作视图可以折叠起来。

always 总是显示在菜单栏上。

 如果你想要在操作栏中提供一个“共享”操作,以充分利用安装在设备上的其他应用程序(如,把一张图片共享给消息或社交应用程序使用),那么使用ShareActionProvider类是一个有效的方法,而不是添加一个调用ACTION_SEND类型Intent对象的操作项。当你给一个操作项使用ShareActionProvider类时,它会呈现一个带有能够处理ACTION_SEND类型Intent对象的应用程序的下拉列表(如图3所示)。
                

       图3 Gallery 应用截屏,用ShareActionProvider对象展开显示共享目标。

        创建子菜单的所有逻辑,包括共享目标的封装、点击事件的处理(包在溢出菜单中的项目显示)等,都在ShareActionProvider类中实现了---你需要编写的唯一的代码是给对应的菜单项声明操作提供器,并指定共享的Intent对象。

        默认情况,ShareActionProvider对象会基于用户的使用频率来保留共享目标的排列顺序。使用频率高的目标应用程序会显示在下来列表的上面,并且最常用的目标会作为默认共享目标直接显示在操作栏。默认情况下,排序信息被保存在由DEFAULT_SHARE_HISTORY_FILE_NAME指定名称的私有文件中。如果你只使用一种操作类型ShareActionProvider类或它的一个子类,那么你应该继续使用这个默认的历史文件,而不需要做任何事情。但是,如果你使用了不同类型的多个操作的ShareActionProvider类或它的一个子类,那么为了保持它们自己的历史,每种ShareActionProvider类都应该指定它们自己的历史文件。给每种ShareActionProvider类指定不同的历史文件,就要调用setShareHistoryFileName()方法,并且提供一个XML文件的名字(如,custom_share_history.xml)

       注意:尽管ShareActionProvider类是基于使用频率来排列共享目标的,但是这种行为是可扩展的,并且ShareActionProvider类的扩展能够基于历史文件执行不同的行为和排序。

        要添加ShareActionProvider对象,只需简单的给android.actionProviderClass属性设定android.widget.ShareActionProvider属性值就可以了。唯一要做的事情是定义你要用于共享的Intent对象,你必须先调用getActionProvider()方法来获取跟菜单项匹配的ShareActionProvider对象,然后调用setShareIntent()方法。

      如果对于共享的Intent对象的格式依赖与被选择的菜单项,或其他的在Activity生存周期内改变的变量,那么你应该把ShareActionProvider对象保存在一个成员属性里,并在需要的时候调用setShareIntent()方法来更新它。如:

[java] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. private ShareActionProvider mShareActionProvider;  
  2. ...  
  3.   
  4. @Override  
  5. public boolean onCreateOptionsMenu(Menu menu) {  
  6.     mShareActionProvider = (ShareActionProvider) menu.findItem(R.id.menu_share).getActionProvider();  
  7.   
  8.     // If you use more than one ShareActionProvider, each for a different action,  
  9.     // use the following line to specify a unique history file for each one.  
  10.     // mShareActionProvider.setShareHistoryFileName("custom_share_history.xml");  
  11.   
  12.     // Set the default share intent   
  13.     mShareActionProvider.setShareIntent(getDefaultShareIntent());  
  14.   
  15.     return true;  
  16. }  
  17. // When you need to update the share intent somewhere else in the app, call  
  18. // mShareActionProvider.setShareIntent()  
       上例中ShareActionProvider对象处理所有的跟这个菜单项有关的用户交互,并且不需要处理来自onOptionsItemSelected()回调方法的点击事件。



@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);ActionBar actionbar=getActionBar();     actionbar.setDisplayHomeAsUpEnabled(true);}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {//inflater 菜单xmlgetMenuInflater().inflate(R.menu.main, menu);//得到菜单里的ItemMenuItem shareItem = menu.findItem(R.id.action_share);//得到ShareActionProvider组件mShareActionProvider = (ShareActionProvider) shareItem.getActionProvider();//设置intent 跳转页面mShareActionProvider.setShareIntent(getDefaultIntent());return true;}private Intent getDefaultIntent(){//发送意图  查看手机有这方面的应用Intent intent = new Intent(Intent.ACTION_SEND);//可以发送图片类型intent.setType("image/*");return intent;}  // 选择菜单后的回调方法@Overridepublic boolean onOptionsItemSelected(MenuItem item) {switch (item.getItemId()){case android.R.id.home:finish();break;case R.id.action_search:Toast.makeText(this, "Action_Search", 0).show();break;case R.id.action_setting:Toast.makeText(this, "Action_Setting", 0).show();break;}return super.onOptionsItemSelected(item);}
在Themes.xml里

<span style="font-size:18px;"><?xml version="1.0" encoding="utf-8"?><resources xmlns:android="http://schemas.android.com/apk/res/android">    <style name="CustomActionBarTheme" parent="@android:style/Theme.Holo.Light.DarkActionBar">        <item name="android:actionBarStyle">@style/CustomBackground</item>    </style>    <style name="CustomBackground" parent="@android:style/Widget.Holo.Light.ActionBar.Solid.Inverse">        <item name="android:background">@drawable/actionbar_background</item>    </style>        <style         name="CustomActionBarOverlayTheme"        parent="@android:style/Theme.Holo"        >        <item name="android:windowActionBarOverlay">true</item>            </style></resources></span>

actionbar 的tab标签


@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main); container=this.findViewById(R.id.container);ActionBar s= getActionBar();s.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);for(int i=0;i<4;i++){s.addTab(s.newTab().setText("标签"+i).setTabListener(new MyTabListener(new fragment("海贼王"+i))));}} class MyTabListener implements TabListener{ Fragment f; public MyTabListener(Fragment f){ this.f=f; }@Overridepublic void onTabSelected(Tab tab, FragmentTransaction ft) {ft.replace(R.id.container, f);}@Overridepublic void onTabUnselected(Tab tab, FragmentTransaction ft) {// TODO Auto-generated method stub}@Overridepublic void onTabReselected(Tab tab, FragmentTransaction ft) {// TODO Auto-generated method stub}  }
actionbar一些样式:

   <style name="Theme.Xuexi" parent="@android:style/Theme.Holo.Light.DarkActionBar">        <item name="android:actionBarItemBackground">@drawable/selectable_background_xuexi</item>        <item name="android:popupMenuStyle">@style/PopupMenu.Xuexi</item>        <item name="android:dropDownListViewStyle">@style/DropDownListView.Xuexi</item>        <item name="android:actionBarTabStyle">@style/ActionBarTabStyle.Xuexi</item>        <item name="android:actionDropDownStyle">@style/DropDownNav.Xuexi</item>        <item name="android:actionBarStyle">@style/ActionBar.Solid.Xuexi</item>        <item name="android:actionModeBackground">@drawable/cab_background_top_xuexi</item>        <item name="android:actionModeSplitBackground">@drawable/cab_background_bottom_xuexi</item>        <item name="android:actionModeCloseButtonStyle">@style/ActionButton.CloseMode.Xuexi</item>                        <!-- Light.DarkActionBar specific -->        <item name="android:actionBarWidgetTheme">@style/Theme.Xuexi.Widget</item>    </style>    <style name="ActionBar.Solid.Xuexi" parent="@android:style/Widget.Holo.Light.ActionBar.Solid.Inverse">        <item name="android:background">@drawable/ab_solid_xuexi</item>        <item name="android:backgroundStacked">@drawable/ab_stacked_solid_xuexi</item>        <item name="android:backgroundSplit">@drawable/ab_bottom_solid_xuexi</item>        <item name="android:progressBarStyle">@style/ProgressBar.Xuexi</item>        <item  name="android:itemPadding">@dimen/actionbar_padding</item>    </style>    <style name="ActionBar.Transparent.Xuexi" parent="@android:style/Widget.Holo.ActionBar">        <item name="android:background">@drawable/ab_transparent_xuexi</item>        <item name="android:progressBarStyle">@style/ProgressBar.Xuexi</item>    </style>    <style name="PopupMenu.Xuexi" parent="@android:style/Widget.Holo.ListPopupWindow">        <item name="android:popupBackground">@drawable/menu_dropdown_panel_xuexi</item>    </style>    <style name="DropDownListView.Xuexi" parent="@android:style/Widget.Holo.ListView.DropDown">        <item name="android:listSelector">@drawable/selectable_background_xuexi</item>    </style>    <style name="ActionBarTabStyle.Xuexi" parent="@android:style/Widget.Holo.ActionBar.TabView">        <item name="android:background">@drawable/tab_indicator_ab_xuexi</item>    </style>    <style name="DropDownNav.Xuexi" parent="@android:style/Widget.Holo.Spinner">        <item name="android:background">@drawable/spinner_background_ab_xuexi</item>        <item name="android:popupBackground">@drawable/menu_dropdown_panel_xuexi</item>        <item name="android:dropDownSelector">@drawable/selectable_background_xuexi</item>    </style>        <style name="ProgressBar.Xuexi" parent="@android:style/Widget.Holo.ProgressBar.Horizontal">        <item name="android:progressDrawable">@drawable/progress_horizontal_xuexi</item>    </style>        <style name="ActionButton.CloseMode.Xuexi" parent="@android:style/Widget.Holo.ActionButton.CloseMode">        <item name="android:background">@drawable/btn_cab_done_xuexi</item>    </style>    <!-- this style is only referenced in a Light.DarkActionBar based theme -->    <style name="Theme.Xuexi.Widget" parent="@android:style/Theme.Holo">        <item name="android:popupMenuStyle">@style/PopupMenu.Xuexi</item>        <item name="android:dropDownListViewStyle">@style/DropDownListView.Xuexi</item>    </style></resources>

在android2.1以上的设备   工程需要 依赖android-support-v7-appcompat 兼容包

跟3.0相比有些不同 如下:

要加入命名空间 :xmlns:juntao="http://schemas.android.com/apk/res-auto"

showAsAction 和actionViewClass 都需要用自定义命名空间

<menu xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:juntao="http://schemas.android.com/apk/res-auto" ><!--   <item  --><!--         android:id="@+id/action_search" --><!--         android:icon="@drawable/ic_action_search" --><!--         android:title="@string/search" --><!--         juntao:showAsAction="ifRoom" --><!--         /> -->   <item        android:id="@+id/menu_search"        juntao:actionViewClass="android.widget.SearchView"        android:icon="@drawable/ic_action_search"        juntao:showAsAction="ifRoom|collapseActionView"        android:title="@string/search">    </item></menu>
继承actionbarActivity 
public class MainActivity extends ActionBarActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);getSupportActionBar().setDisplayHomeAsUpEnabled(true);}
Themes.xml下的主题文件:

@style/Theme.AppCompat.Light.DarkActionBar 比起3.0的应用 少了android:style 改为@style    和Holo该为AppCompat

<?xml version="1.0" encoding="utf-8"?><resources>        <style name="CustomActionBarTheme" parent="@style/Theme.AppCompat.Light.DarkActionBar">        <item name="actionBarStyle">@style/CustomBackground</item>    </style>     <style name="CustomBackground" parent="@style/Widget.AppCompat.Light.ActionBar.Solid.Inverse">        <item name="background">@drawable/actionbar_background</item>    </style>        <style         name="CustomActionBarOverlayTheme" parent="@style/Theme.AppCompat"        >        <item name="windowActionBarOverlay">true</item>            </style>    </resources>

最后来介绍一个ActionbarSherlock 兼容各个版本的actionbar开发:

首先activity要继承SherlockActivity



<span style="font-size:18px;">@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);</span>
<span style="font-size:18px;">ActionBar actionBar = getSupportActionBar();actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1);for (int i=0;i<5;i++)adapter.add("航海王" + i);actionBar.setListNavigationCallbacks(adapter, new OnNavigationListener() {@Overridepublic boolean onNavigationItemSelected(int itemPosition, long itemId) {Toast.makeText(MainActivity.this, "select " + itemPosition, 0).show();return false;}});}</span>




android:theme="@style/Sherlock.__Theme.DarkActionBar"










0 0
原创粉丝点击