Android Actionbar学习笔记(三)-----修改Actionbar的样式

分类:Android 控件 193人阅读 评论(1) 收藏 举报

本例几乎涵盖了有关Actionbar的所有操作,由于前面介绍过tabs和item,这里重点介绍Actionbar的样式修改,需要源工程的请在资源里下载styleactionbar。更多请阅读http://android-developers.blogspot.com/2011/04/customizing-action-bar.html

1、首先准备一个RoundedColourFragment,前面介绍过各部分的作用,这里就不赘述。

view plain
  1. importandroid.app.Fragment;
  2. importandroid.graphics.drawable.GradientDrawable;
  3. importandroid.os.Bundle;
  4. importandroid.view.LayoutInflater;
  5. importandroid.view.View;
  6. importandroid.view.ViewGroup;
  7. importandroid.view.ViewGroup.LayoutParams;
  8. importandroid.widget.LinearLayout;
  9. publicclassRoundedColourFragmentextendsFragment{
  10. privateViewmView;
  11. privateintmColour;
  12. privatefloatmWeight;
  13. privateintmarginLeft,marginRight,marginTop,marginBottom;
  14. //needapublicemptyconstructorforframeworktoinstantiate
  15. publicRoundedColourFragment(){
  16. }
  17. publicRoundedColourFragment(intcolour,floatweight,intmargin_left,
  18. intmargin_right,intmargin_top,intmargin_bottom){
  19. mColour=colour;
  20. mWeight=weight;
  21. marginLeft=margin_left;
  22. marginRight=margin_right;
  23. marginTop=margin_top;
  24. marginBottom=margin_bottom;
  25. }
  26. @Override
  27. publicvoidonCreate(BundlesavedInstanceState){
  28. super.onCreate(savedInstanceState);
  29. mView=newView(getActivity());
  30. GradientDrawablebackground=(GradientDrawable)getResources()
  31. .getDrawable(R.drawable.rounded_rect);
  32. background.setColor(mColour);
  33. mView.setBackgroundDrawable(background);
  34. LinearLayout.LayoutParamslp=newLinearLayout.LayoutParams(0,
  35. LayoutParams.FILL_PARENT,mWeight);
  36. lp.setMargins(marginLeft,marginTop,marginRight,marginBottom);
  37. mView.setLayoutParams(lp);
  38. }
  39. @Override
  40. publicViewonCreateView(LayoutInflaterinflater,ViewGroupcontainer,
  41. BundlesavedInstanceState){
  42. returnmView;
  43. }
  44. }


2、MainActivity.java文件,主要是创建tabs、item、drop down navigation等,以及他们之间相互转换的控制逻辑,一部分内容前面也介绍过。

view plain
  1. importandroid.animation.ObjectAnimator;
  2. importandroid.app.ActionBar;
  3. importandroid.app.Activity;
  4. importandroid.app.FragmentTransaction;
  5. importandroid.app.ActionBar.OnNavigationListener;
  6. importandroid.os.Bundle;
  7. importandroid.os.Handler;
  8. importandroid.view.Menu;
  9. importandroid.view.MenuItem;
  10. importandroid.view.MenuItem.OnMenuItemClickListener;
  11. importandroid.widget.ArrayAdapter;
  12. publicclassMainActivityextendsActivityimplementsActionBar.TabListener{
  13. privatefinalHandlerhandler=newHandler();
  14. privateRoundedColourFragmentleftFrag;
  15. privateRoundedColourFragmentrightFrag;
  16. privatebooleanuseLogo=false;
  17. privatebooleanshowHomeUp=false;
  18. /**Calledwhentheactivityisfirstcreated.*/
  19. @Override
  20. publicvoidonCreate(BundlesavedInstanceState){
  21. super.onCreate(savedInstanceState);
  22. setContentView(R.layout.main);
  23. finalActionBarab=getActionBar();
  24. //setdefaultsforlogo&homeup
  25. ab.setDisplayHomeAsUpEnabled(showHomeUp);
  26. ab.setDisplayUseLogoEnabled(useLogo);
  27. //setuptabsnav
  28. for(inti=1;i<4;i++){
  29. ab.addTab(ab.newTab().setText("Tab"+i).setTabListener(this));
  30. }
  31. //setuplistnav
  32. ab.setListNavigationCallbacks(ArrayAdapter
  33. .createFromResource(this,R.array.sections,
  34. android.R.layout.simple_spinner_dropdown_item),
  35. newOnNavigationListener(){
  36. publicbooleanonNavigationItemSelected(intitemPosition,
  37. longitemId){
  38. //FIXMEaddproperimplementation
  39. rotateLeftFrag();
  40. returnfalse;
  41. }
  42. });
  43. //defaulttotabnavigation
  44. showTabsNav();
  45. //createacoupleofsimplefragmentsasplaceholders
  46. finalintMARGIN=16;
  47. leftFrag=newRoundedColourFragment(getResources().getColor(
  48. R.color.android_green),1f,MARGIN,MARGIN/2,MARGIN,MARGIN);
  49. rightFrag=newRoundedColourFragment(getResources().getColor(
  50. R.color.honeycombish_blue),2f,MARGIN/2,MARGIN,MARGIN,
  51. MARGIN);
  52. FragmentTransactionft=getFragmentManager().beginTransaction();
  53. ft.add(R.id.root,leftFrag);
  54. ft.add(R.id.root,rightFrag);
  55. ft.commit();
  56. }
  57. @Override
  58. publicbooleanonCreateOptionsMenu(Menumenu){
  59. getMenuInflater().inflate(R.menu.main_menu,menu);
  60. //setupalistenerfortherefreshitem
  61. finalMenuItemrefresh=(MenuItem)menu.findItem(R.id.menu_refresh);
  62. refresh.setOnMenuItemClickListener(newOnMenuItemClickListener(){
  63. //onselectingshowprogressspinnerfor1s
  64. publicbooleanonMenuItemClick(MenuItemitem){
  65. //item.setActionView(R.layout.progress_action);
  66. handler.postDelayed(newRunnable(){
  67. publicvoidrun(){
  68. refresh.setActionView(null);
  69. }
  70. },1000);
  71. returnfalse;
  72. }
  73. });
  74. returnsuper.onCreateOptionsMenu(menu);
  75. }
  76. @Override
  77. publicbooleanonOptionsItemSelected(MenuItemitem){
  78. switch(item.getItemId()){
  79. caseandroid.R.id.home:
  80. //TODOhandleclickingtheappicon/logo
  81. returnfalse;
  82. caseR.id.menu_refresh:
  83. //switchtoaprogressanimation
  84. item.setActionView(R.layout.indeterminate_progress_action);
  85. returntrue;
  86. caseR.id.menu_both:
  87. //rotationanimationofgreenfragment
  88. rotateLeftFrag();
  89. returntrue;
  90. caseR.id.menu_text:
  91. //alphaanimationofbluefragment
  92. ObjectAnimatoralpha=ObjectAnimator.ofFloat(rightFrag.getView(),
  93. "alpha",1f,0f);
  94. alpha.setRepeatMode(ObjectAnimator.REVERSE);
  95. alpha.setRepeatCount(1);
  96. alpha.setDuration(800);
  97. alpha.start();
  98. returntrue;
  99. caseR.id.menu_logo:
  100. useLogo=!useLogo;
  101. item.setChecked(useLogo);
  102. getActionBar().setDisplayUseLogoEnabled(useLogo);
  103. returntrue;
  104. caseR.id.menu_up:
  105. showHomeUp=!showHomeUp;
  106. item.setChecked(showHomeUp);
  107. getActionBar().setDisplayHomeAsUpEnabled(showHomeUp);
  108. returntrue;
  109. caseR.id.menu_nav_tabs:
  110. item.setChecked(true);
  111. showTabsNav();
  112. returntrue;
  113. caseR.id.menu_nav_label:
  114. item.setChecked(true);
  115. showStandardNav();
  116. returntrue;
  117. caseR.id.menu_nav_drop_down:
  118. item.setChecked(true);
  119. showDropDownNav();
  120. returntrue;
  121. caseR.id.menu_bak_none:
  122. item.setChecked(true);
  123. getActionBar().setBackgroundDrawable(null);
  124. returntrue;
  125. caseR.id.menu_bak_gradient:
  126. item.setChecked(true);
  127. getActionBar().setBackgroundDrawable(getResources().getDrawable(R.drawable.ad_action_bar_gradient_bak));
  128. returntrue;
  129. default:
  130. returnsuper.onOptionsItemSelected(item);
  131. }
  132. }
  133. privatevoidrotateLeftFrag(){
  134. if(leftFrag!=null){
  135. ObjectAnimator.ofFloat(leftFrag.getView(),"rotationY",0,180)
  136. .setDuration(500).start();
  137. }
  138. }
  139. privatevoidshowStandardNav(){
  140. ActionBarab=getActionBar();
  141. if(ab.getNavigationMode()!=ActionBar.NAVIGATION_MODE_STANDARD){
  142. ab.setDisplayShowTitleEnabled(true);
  143. ab.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD);
  144. }
  145. }
  146. privatevoidshowDropDownNav(){
  147. ActionBarab=getActionBar();
  148. if(ab.getNavigationMode()!=ActionBar.NAVIGATION_MODE_LIST){
  149. ab.setDisplayShowTitleEnabled(false);
  150. ab.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);
  151. }
  152. }
  153. privatevoidshowTabsNav(){
  154. ActionBarab=getActionBar();
  155. if(ab.getNavigationMode()!=ActionBar.NAVIGATION_MODE_TABS){
  156. ab.setDisplayShowTitleEnabled(false);
  157. ab.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
  158. }
  159. }
  160. publicvoidonTabSelected(ActionBar.Tabtab,FragmentTransactionft){
  161. //FIXMEaddaproperimplementation,fornowjustrotatetheleft
  162. //fragment
  163. rotateLeftFrag();
  164. }
  165. publicvoidonTabUnselected(ActionBar.Tabtab,FragmentTransactionft){
  166. //FIXMEimplementthis
  167. }
  168. publicvoidonTabReselected(ActionBar.Tabtab,FragmentTransactionft){
  169. //FIXMEimplementthis
  170. }
  171. }


3、在res/values下的styles.xml文件,这里是本程序讲解的核心,也是actionbar样式转换的核心,java代码如下:

view plain
  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <resources>
  3. <!--Baseapplicationthemeisthedefaulttheme.-->
  4. <stylename="Theme"parent="android:Theme"></style>
  5. <!--VariationontheHoloLightthemethatstylestheActionBar-->
  6. <!--style的名字是Theme.AndroidDevelopers,父类为Theme.Holo.Light,即白底黑字(如果是Theme.Holo,则为黑底白字)-->
  7. <stylename="Theme.AndroidDevelopers"parent="android:style/Theme.Holo.Light">
  8. <!--这是items的颜色变化,未选中时为白色,选中时为绿色,逻辑请见ad_selectable_background.xml-->
  9. <itemname="android:selectableItemBackground">@drawable/ad_selectable_background</item>
  10. <!--其他部分的颜色变化跟上面类似-->
  11. <itemname="android:popupMenuStyle">@style/MyPopupMenu</item>
  12. <itemname="android:dropDownListViewStyle">@style/MyDropDownListView</item>
  13. <itemname="android:actionBarTabStyle">@style/MyActionBarTabStyle</item>
  14. <itemname="android:actionDropDownStyle">@style/MyDropDownNav</item>
  15. <itemname="android:listChoiceIndicatorMultiple">@drawable/ad_btn_check_holo_light</item>
  16. <itemname="android:listChoiceIndicatorSingle">@drawable/ad_btn_radio_holo_light</item>
  17. <!--<itemname="android:actionOverflowButtonStyle">@style/MyOverflowButton</item>-->
  18. </style>
  19. <!--styletheoverflowmenu-->
  20. <stylename="MyPopupMenu"parent="android:style/Widget.Holo.Light.ListPopupWindow">
  21. <itemname="android:popupBackground">@drawable/ad_menu_dropdown_panel_holo_light</item>
  22. </style>
  23. <!--styletheitemswithintheoverflowmenu-->
  24. <stylename="MyDropDownListView"parent="android:style/Widget.Holo.ListView.DropDown">
  25. <itemname="android:listSelector">@drawable/ad_selectable_background</item>
  26. </style>
  27. <!--styleforthetabs-->
  28. <stylename="MyActionBarTabStyle"parent="android:style/Widget.Holo.Light.ActionBarView_TabView">
  29. <itemname="android:background">@drawable/actionbar_tab_bg</item>
  30. <itemname="android:paddingLeft">32dp</item>
  31. <itemname="android:paddingRight">32dp</item>
  32. </style>
  33. <!--stylethelistnavigation-->
  34. <stylename="MyDropDownNav"parent="android:style/Widget.Holo.Light.Spinner.DropDown.ActionBar">
  35. <itemname="android:background">@drawable/ad_spinner_background_holo_light</item>
  36. <itemname="android:popupBackground">@drawable/ad_menu_dropdown_panel_holo_light</item>
  37. <itemname="android:dropDownSelector">@drawable/ad_selectable_background</item>
  38. </style>
  39. <!--thefollowingcanbeusedtostyletheoverflowmenubutton
  40. onlydothisifyouhavean*extremely*goodreasonto!!-->
  41. <!--<stylename="MyOverflowButton"parent="@android:style/Widget.Holo.ActionButton.Overflow">
  42. <itemname="android:src">@android:drawable/ic_menu_view</item>
  43. <itemname="android:background">@drawable/action_button_background</item>
  44. </style>-->
  45. </resources>

把style设置好后,只需在AndroidManifest.xml中application或activity的位置加上<activity android:name=".MainActivity"android:theme="@style/Theme.AndroidDevelopers"&gt;即可,作用于一个应用程序或者一个activity。

细心的读者可能会发现,其实以前android的属性拿过来都能用,比如说修改actionbar的高度,<android:height=…>,只需把这些属性放在对应的位置,作为一个<item>存在即可。

4、res/drawable下的一些xml文件,即actionbar修改所需的资源。

4、1------actionbar_tab_bg.xml,用于tab的背景修改。曾一度认为只需在系统tab的基础上修改一下颜色即可,其实不然。需另外弄几张图片,(如我想把tab改成红色背景,那么我就要找几张红色背景的图片)。

view plain
  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <selectorxmlns:android="http://schemas.android.com/apk/res/android">
  3. <itemandroid:state_focused="false"android:state_selected="false"android:state_pressed="false"android:drawable="@drawable/ad_tab_unselected_holo"/>
  4. <itemandroid:state_focused="false"android:state_selected="true"android:state_pressed="false"android:drawable="@drawable/ad_tab_selected_holo"/>
  5. <itemandroid:state_selected="false"android:state_pressed="true"android:drawable="@drawable/ad_tab_selected_pressed_holo"/>
  6. <itemandroid:state_selected="true"android:state_pressed="true"android:drawable="@drawable/ad_tab_selected_pressed_holo"/>
  7. </selector>

4、2------ad_action_bar_gradient_bak.xml,用于actionbar的颜色渐变,本例是从顶到底颜色逐渐变浅。 view plain
  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <shapexmlns:android="http://schemas.android.com/apk/res/android"android:shape="rectangle">
  3. <gradient
  4. android:startColor="@color/honeycombish_blue"
  5. android:endColor="@color/background"
  6. android:type="linear"
  7. android:angle="270"/>
  8. </shape>
4、3------ad_btn_check_holo_light.xml,用于单选背景的变换。 view plain
  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <selectorxmlns:android="http://schemas.android.com/apk/res/android">
  3. <!--Enabledstates-->
  4. <itemandroid:state_checked="true"android:state_window_focused="false"
  5. android:state_enabled="true"android:drawable="@drawable/btn_check_on_holo_light"/>
  6. <itemandroid:state_checked="false"android:state_window_focused="false"
  7. android:state_enabled="true"android:drawable="@drawable/btn_check_off_holo_light"/>
  8. <itemandroid:state_checked="true"android:state_pressed="true"
  9. android:state_enabled="true"android:drawable="@drawable/ad_btn_check_on_pressed_holo_light"/>
  10. <itemandroid:state_checked="false"android:state_pressed="true"
  11. android:state_enabled="true"android:drawable="@drawable/ad_btn_check_off_pressed_holo_light"/>
  12. <!--ignoringfocusedstatesforbrevity
  13. <itemandroid:state_checked="true"android:state_focused="true"
  14. android:state_enabled="true"android:drawable="@drawable/btn_check_on_focused_holo_light"/>
  15. <itemandroid:state_checked="false"android:state_focused="true"
  16. android:state_enabled="true"android:drawable="@drawable/btn_check_off_focused_holo_light"/>
  17. -->
  18. <itemandroid:state_checked="false"android:state_enabled="true"
  19. android:drawable="@drawable/btn_check_off_holo_light"/>
  20. <itemandroid:state_checked="true"android:state_enabled="true"
  21. android:drawable="@drawable/btn_check_on_holo_light"/>
  22. <!--ignoringdisabledstatesforbrevity
  23. <itemandroid:state_checked="true"android:state_window_focused="false"
  24. android:drawable="@drawable/btn_check_on_disabled_holo_light"/>
  25. <itemandroid:state_checked="false"android:state_window_focused="false"
  26. android:drawable="@drawable/btn_check_off_disabled_holo_light"/>
  27. <itemandroid:state_checked="true"android:state_focused="true"
  28. android:drawable="@drawable/btn_check_on_disabled_focused_holo_light"/>
  29. <itemandroid:state_checked="false"android:state_focused="true"
  30. android:drawable="@drawable/btn_check_off_disabled_focused_holo_light"/>
  31. <itemandroid:state_checked="false"
  32. android:drawable="@drawable/btn_check_off_disabled_holo_light"/>
  33. <itemandroid:state_checked="true"
  34. android:drawable="@drawable/btn_check_on_disabled_holo_light"/>
  35. -->
  36. </selector>
4、4------ad_btn_radio_holo_light.xml,用于多选背景的变换。
view plain
  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <selectorxmlns:android="http://schemas.android.com/apk/res/android">
  3. <!--Enabledstates-->
  4. <itemandroid:state_checked="true"android:state_window_focused="false"
  5. android:state_enabled="true"android:drawable="@drawable/btn_radio_on_holo_light"/>
  6. <itemandroid:state_checked="false"android:state_window_focused="false"
  7. android:state_enabled="true"android:drawable="@drawable/btn_radio_off_holo_light"/>
  8. <itemandroid:state_checked="true"android:state_pressed="true"
  9. android:state_enabled="true"android:drawable="@drawable/ad_btn_radio_on_pressed_holo_light"/>
  10. <itemandroid:state_checked="false"android:state_pressed="true"
  11. android:state_enabled="true"android:drawable="@drawable/ad_btn_radio_off_pressed_holo_light"/>
  12. <!--ignoringfocusedstatesforbrevity
  13. <itemandroid:state_checked="true"android:state_focused="true"
  14. android:state_enabled="true"android:drawable="@drawable/btn_radio_on_focused_holo_light"/>
  15. <itemandroid:state_checked="false"android:state_focused="true"
  16. android:state_enabled="true"android:drawable="@drawable/btn_radio_off_focused_holo_light"/>
  17. -->
  18. <itemandroid:state_checked="false"android:state_enabled="true"
  19. android:drawable="@drawable/btn_radio_off_holo_light"/>
  20. <itemandroid:state_checked="true"android:state_enabled="true"
  21. android:drawable="@drawable/btn_radio_on_holo_light"/>
  22. <!--ignoringdisabledstatesforbrevity
  23. <itemandroid:state_checked="true"android:state_window_focused="false"
  24. android:drawable="@drawable/btn_radio_on_disabled_holo_light"/>
  25. <itemandroid:state_checked="false"android:state_window_focused="false"
  26. android:drawable="@drawable/btn_radio_off_disabled_holo_light"/>
  27. <itemandroid:state_checked="true"android:state_focused="true"
  28. android:drawable="@drawable/btn_radio_on_disabled_focused_holo_light"/>
  29. <itemandroid:state_checked="false"android:state_focused="true"
  30. android:drawable="@drawable/btn_radio_off_disabled_focused_holo_light"/>
  31. <itemandroid:state_checked="false"
  32. android:drawable="@drawable/btn_radio_off_disabled_holo_light"/>
  33. <itemandroid:state_checked="true"
  34. android:drawable="@drawable/btn_radio_on_disabled_holo_light"/>
  35. -->
  36. </selector>
4、5------ad_btn_radio_holo_light.xml,用于item背景的变换,未选中时为透明,选中未绿色。
view plain
  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <selectorxmlns:android="http://schemas.android.com/apk/res/android"
  3. android:exitFadeDuration="@android:integer/config_mediumAnimTime">
  4. <itemandroid:state_pressed="true"android:drawable="@drawable/selected_background"/>
  5. <itemandroid:drawable="@android:color/transparent"/>
  6. </selector>
4、6------ad_spinner_background_holo_light.xml,用于下拉列表背景的变换。
view plain
  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <selectorxmlns:android="http://schemas.android.com/apk/res/android">
  3. <itemandroid:state_enabled="false"
  4. android:drawable="@drawable/spinner_disabled_holo_light"/>
  5. <itemandroid:state_pressed="true"
  6. android:drawable="@drawable/ad_spinner_pressed_holo_light"/>
  7. <itemandroid:state_pressed="false"android:state_focused="true"
  8. android:drawable="@drawable/ad_spinner_focused_holo_light"/>
  9. <itemandroid:drawable="@drawable/spinner_default_holo_light"/>
  10. </selector>
4、7------rounded_rect.xml,用于本例RoundedColourFragment视图的设置。
view plain
  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <shapexmlns:android="http://schemas.android.com/apk/res/android"android:shape="rectangle">
  3. <cornersandroid:radius="@dimen/frag_rounding_radius"/>
  4. </shape>
dimens.xml view plain
  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <resources>
  3. <dimenname="frag_rounding_radius">20dp</dimen>
  4. <dimenname="progress_action_padding">8dp</dimen>
  5. </resources>

至此,这个工程的逻辑介绍完毕。言语介绍肯定不会很明白,需要的同行可看源代码,相信各位精英能很快领悟到其中的技术,应用到自己的工程中去,使actionbar具有各自工程的特色。

更多相关文章

  1. 【Android】Could not find XXX.apk!的解决方法
  2. Android(安卓)运行时改变 Drawable 的填充色[Toast 样式的进阶版
  3. Android(安卓)Paint和Color类绘画实例
  4. 设置背景图时防止图片拉伸的解决方法
  5. Android(安卓)颜色渲染(九) PorterDuff及Xfermode详解
  6. 将已有的Android从Eclipse手动迁移到Android(安卓)Studio(不用gr
  7. OpenERP Android(安卓)DEMO工程发布下载
  8. android listView滚动时隔行出现黑色分割线
  9. 为PhoneGap写一个android插件

随机推荐

  1. Android(安卓)zip、tar+gz 压缩解压
  2. android density
  3. //转//Revisiting Android(安卓)disk enc
  4. Android(安卓)Code name Version API lev
  5. Android(安卓)侧滑删除功能
  6. Android生命周期实验
  7. Android(安卓)RSA 公钥加密、解密
  8. Android(Java):按钮复选框点中效果
  9. Android消息机制
  10. 图片压缩