android2.x使用ActionBar的总结

好久没有在csdn上写博客了,最近闲来无事,决定仿微信界面做几个东西,原本以为挺简单的事情,结果折腾了好久才把第一步的ActionBar搞定,其中过程可谓坎坷之极,记录下来,以便给各位分享。

首先介绍一下我的手机,我的手机是android2.3.4的系统,要使用ActionBar,有两种选择,一个是使用大名鼎鼎的开源组件:ActionBarSherlock;一个是使用google自己出的android-support-v7包;ActionBarSherlock自从google推出android-support-v7包以后,基本上要退出历史舞台了,因此我决定使用android-support-v7一试。

首先下载android-support-v7-appcompat(包括jar包和资源项目),新建项目weixin(注意最低sdk版本要求),引入android-support-v7-appcompat.jar(把该jar包放到lib目录下,刷新工程),并把android-support-v7-appcompat资源项目作为类库引入到项目中,项目结果如下

新建MainActivity,继承类android.support.v7.app.ActionBarActivity,代码如下:

package com.example.weixin;

import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.view.Menu;

public class MainActivity extends ActionBarActivity{

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}

}

修改res\values\styles.xml,使用androi-support-v7的Theme.AppCompat.Light.DarkActionBar风格,如下

<resources>

    <!--
        Base application theme, dependent on API level. This theme is replaced
        by AppBaseTheme from res/values-vXX/styles.xml on newer devices.
    -->
    <style name="AppBaseTheme" parent="Theme.AppCompat.Light.DarkActionBar"</span>>
        <!--
            Theme customizations available in newer API levels can go in
            res/values-vXX/styles.xml, while customizations related to
            backward-compatibility can go here.
        -->
    </style>

    <!-- Application theme. -->
    <style name="AppTheme" parent="AppBaseTheme">
        <!-- All customizations that are NOT specific to a particular API-level can go here. -->
    </style>

</resources>

修改res\menu\main.xml,如下:

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

    <!--android.widget.SearchView在api11之前不存在,需要使用 android.support.v7.widget.SearchView-->
    <item
        android:id="@+id/action_search"
        alpha:actionViewClass="android.support.v7.widget.SearchView"
        android:actionProviderClass=""
        android:icon="@drawable/actionbar_search_icon"
        alpha:showAsAction="ifRoom|collapseActionView"
        android:title="@string/action_search"/>

    <item
        android:id="@+id/action_groupchat"
        android:icon="@drawable/ofm_group_chat_icon"
        alpha:showAsAction="never"
        android:title="@string/action_groupchat"/>
    <item
        android:id="@+id/action_addfriend"
        android:icon="@drawable/ofm_add_icon"
        alpha:showAsAction="never"
        android:title="@string/action_addfriend"/>
    <item
        android:id="@+id/action_scanqrcode"
        android:icon="@drawable/ofm_qrcode_icon"
        alpha:showAsAction="never"
        android:title="@string/action_scanqrcode"/>
    <item
        android:id="@+id/action_feedback"
        android:icon="@drawable/ofm_feedback_icon"
        alpha:showAsAction="never"
        android:title="@string/action_feedback"/>
</menu>

解析一下,由于android3.0之前,并没有showAsAction、actionProviderClass和actionViewClass等属性,因此需要引入命名空间:xmlns:xxx="http://schemas.android.com/apk/res-auto",使用android-support-v7-appcompat包的属性,因此后面的menuitem的统一使用xxx:showAsAction、xxx:actionProviderClass和xxx:actionViewClass而不是android:showAsAction、android:actionProviderClass和android:actionViewClass;另外搜索按钮的actionViewClass,在android3.0以后可以使用android.widget.SearchView,但在android3.0之前该类并不存在,需要使用android.support.v7.widget.SearchView

经过这样设置以后,按理来说就应该可以了,我们在android2.3环境下运行试试

android2.3运行效果:

发现ActionBar没有overflow按钮,点击物理menu键在下面出现了上下文菜单,这并不是我们想要的效果,查看android doc可知,overflow按钮的显示情况和手机的硬件情况是有关系的,如果手机没有物理Menu键的话,overflow按钮就可以显示, 如果有物理Menu键的话,overflow按钮就不会显示出来,要改变这个默认行为,在ViewConfiguration这个类中, 有一个叫做sHasPermanentMenuKey的静态变量,系统就是根据这个变量的值来判断手机有没有物理Menu键的。当然这是一个内部变量,我们无法直接访问它,但是可以通过反射的方式修改它的值,让它永远为false就可以了。在MainActivity中增加方法

	private void setOverflowShowingAlway(){
		try{
			ViewConfiguration config = ViewConfiguration.get(this);
			Field menuKeyField = ViewConfiguration.class
					.getDeclaredField("sHasPermanentMenuKey");
			menuKeyField.setAccessible(true);
			menuKeyField.setBoolean(config, false);
		}catch(Exception e){
			e.printStackTrace();
		}
	}

并在onCreate(Bundle savedInstanceState)方法中调用

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		setOverflowShowingAlway();
	}

重新运行,发现在android4.0环境下,出现了overflow按钮了,并且按物理menu键也显示正常,只是显示的菜单中只有文字,而没有显示图标,这是官方的默认效果,Google认为隐藏在overflow中的Action按钮都应该只显示文字,其实,overflow中的Action按钮应不应该显示图标,是由MenuBuilder这个类的setOptionalIconsVisible方法来决定的,如果我们在overflow被展开的时候给这个方法传入true,那么里面的每一个Action按钮对应的图标就都会显示出来了,继续在MainActivity中增加方法

  private void setOptionalIconsVisible(Menu menu){
		if(menu == null) return;
		if(!menu.getClass().getSimpleName().equals("MenuBuilder")) return;
		try {
            Method m = menu.getClass().getDeclaredMethod("setOptionalIconsVisible", Boolean.TYPE);
            m.setAccessible(true);
            m.invoke(menu, true);
        } catch (Exception e) {
        }
	}

	@Override
	public boolean onMenuOpened(int featureId, Menu menu) {
		if(featureId == Window.FEATURE_ACTION_BAR){
			setOptionalIconsVisible(menu);
		}
	    return super.onMenuOpened(featureId, menu);
	}

重新运行,发现android4.0环境下已经运行正常了,运行效果如下:

正在高兴之余,打开android2.3环境下运行,发现android2.3环境并没有任何变化,overflow按钮没有出来,且按下物理menu键以后再下面出现了上下文菜单,在logcat中出现以下错误:

03-06 13:57:51.587: W/System.err(328): java.lang.NoSuchFieldException: sHasPermanentMenuKey
03-06 13:57:51.606: W/System.err(328): 	at java.lang.ClassCache.findFieldByName(ClassCache.java:446)
03-06 13:57:51.616: W/System.err(328): 	at java.lang.Class.getDeclaredField(Class.java:666)
03-06 13:57:51.626: W/System.err(328): 	at com.example.weixin.MainActivity.setOverflowShowingAlway(MainActivity.java:32)
03-06 13:57:51.636: W/System.err(328): 	at com.example.weixin.MainActivity.onCreate(MainActivity.java:19)
03-06 13:57:51.636: W/System.err(328): 	at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
03-06 13:57:51.647: W/System.err(328): 	at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1586)
03-06 13:57:51.656: W/System.err(328): 	at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1638)
03-06 13:57:51.656: W/System.err(328): 	at android.app.ActivityThread.access$1500(ActivityThread.java:117)
03-06 13:57:51.667: W/System.err(328): 	at android.app.ActivityThread$H.handleMessage(ActivityThread.java:928)
03-06 13:57:51.676: W/System.err(328): 	at android.os.Handler.dispatchMessage(Handler.java:99)
03-06 13:57:51.696: W/System.err(328): 	at android.os.Looper.loop(Looper.java:123)
03-06 13:57:51.707: W/System.err(328): 	at android.app.ActivityThread.main(ActivityThread.java:3647)
03-06 13:57:51.717: W/System.err(328): 	at java.lang.reflect.Method.invokeNative(Native Method)
03-06 13:57:51.736: W/System.err(328): 	at java.lang.reflect.Method.invoke(Method.java:507)
03-06 13:57:51.746: W/System.err(328): 	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
03-06 13:57:51.756: W/System.err(328): 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
03-06 13:57:51.756: W/System.err(328): 	at dalvik.system.NativeStart.main(Native Method)

在ViewConfiguration没有找到sHasPermanentMenuKey这个类成员!原来android3.0之前,ViewConfiguration并没有sHasPermanentMenuKey这个类成员,怎么办呢?不管度娘还是google,都找不到这个错误的解决办法,只能从sdk的源代码中跟踪了。

首先查找android4.0版本中看看在哪使用了ViewConfiguration.hasPermanentMenuKey()方法,经过分析是在类com.android.internal.view.ActionBarPolicy中的showsOverflowMenuButton()使用了,代码如下:

    public boolean showsOverflowMenuButton() {
        return !ViewConfiguration.get(mContext).hasPermanentMenuKey();
    }

类ActionBarPolicy的方法showsOverflowMenuButton()又在哪被使用了呢?原来是在类com.android.internal.view.menu.ActionMenuPresenter的方法initForMenu(Context context, MenuBuilder menu)中使用了

    @Override
    public void initForMenu(Context context, MenuBuilder menu) {
        super.initForMenu(context, menu);

        final Resources res = context.getResources();

        final ActionBarPolicy abp = ActionBarPolicy.get(context);
        if (!mReserveOverflowSet) {
            mReserveOverflow = abp.showsOverflowMenuButton();
        }

        if (!mWidthLimitSet) {
            mWidthLimit = abp.getEmbeddedMenuWidthLimit();
        }

        // Measure for initial configuration
        if (!mMaxItemsSet) {
            mMaxItems = abp.getMaxActionButtons();
        }

        int width = mWidthLimit;
        if (mReserveOverflow) {
            if (mOverflowButton == null) {    // 创建overflow按钮
                mOverflowButton = new OverflowMenuButton(mSystemContext);
                final int spec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED);
                mOverflowButton.measure(spec, spec);
            }
            width -= mOverflowButton.getMeasuredWidth();
        } else {
            mOverflowButton = null;
        }

        mActionItemWidthLimit = width;

        mMinCellSize = (int) (ActionMenuView.MIN_CELL_SIZE * res.getDisplayMetrics().density);

        // Drop a scrap view as it may no longer reflect the proper context/config.
        mScrapActionButtonView = null;
    }

原来在ActionBarMenu初始化时,是根据showsOverflowMenuButton()的返回结果来决定是否创建overflow按钮的,而在android-support-v7-appcompat中也有类ActionBarPolicy和ActionMenuPresenter,其中类ActionMenuPresenter的initForMenu方法与android4.0版本代码差不多,但是类ActionBarPolicy的showsOverflowMenuButton()代码却如下:

  public boolean showsOverflowMenuButton()
  {
    return Build.VERSION.SDK_INT >= 11;
  }

判断sdk的版本大于11(版本大于android3.0)即返回true,否则返回false。看来通过反射方法修改类ActionBarPolicy的showsOverflowMenuButton()返回值是不太可能了,继续往下分析,查看一下类ActionMenuPresenter的initForMenu方法在哪被调用了,结果分析,原来是在类android.support.v7.internal.widget.ActionBarView的configPresenters(MenuBuilder
builder)方法中调用的,而configPresenters方法又是在setMenu(SupportMenu menu, MenuPresenter.Callback cb)中调用的,源代码如下:

    public void setMenu(Menu menu, MenuPresenter.Callback cb) {
        if (menu == mOptionsMenu) return;

        if (mOptionsMenu != null) {
            mOptionsMenu.removeMenuPresenter(mActionMenuPresenter);
            mOptionsMenu.removeMenuPresenter(mExpandedMenuPresenter);
        }

        MenuBuilder builder = (MenuBuilder) menu;
        mOptionsMenu = builder;
        if (mMenuView != null) {
            final ViewGroup oldParent = (ViewGroup) mMenuView.getParent();
            if (oldParent != null) {
                oldParent.removeView(mMenuView);
            }
        }
        if (mActionMenuPresenter == null) {
            mActionMenuPresenter = new ActionMenuPresenter(mContext);
            mActionMenuPresenter.setCallback(cb);
            mActionMenuPresenter.setId(com.android.internal.R.id.action_menu_presenter);
            mExpandedMenuPresenter = new ExpandedActionViewMenuPresenter();
        }

        ActionMenuView menuView;
        final LayoutParams layoutParams = new LayoutParams(LayoutParams.WRAP_CONTENT,
                LayoutParams.MATCH_PARENT);
        if (!mSplitActionBar) {
            mActionMenuPresenter.setExpandedActionViewsExclusive(
                    getResources().getBoolean(
                    com.android.internal.R.bool.action_bar_expanded_action_views_exclusive));
            configPresenters(builder);
            menuView = (ActionMenuView) mActionMenuPresenter.getMenuView(this);
            final ViewGroup oldParent = (ViewGroup) menuView.getParent();
            if (oldParent != null && oldParent != this) {
                oldParent.removeView(menuView);
            }
            addView(menuView, layoutParams);
        } else {
            mActionMenuPresenter.setExpandedActionViewsExclusive(false);
            // Allow full screen width in split mode.
            mActionMenuPresenter.setWidthLimit(
                    getContext().getResources().getDisplayMetrics().widthPixels, true);
            // No limit to the item count; use whatever will fit.
            mActionMenuPresenter.setItemLimit(Integer.MAX_VALUE);
            // Span the whole width
            layoutParams.width = LayoutParams.MATCH_PARENT;
            configPresenters(builder);
            menuView = (ActionMenuView) mActionMenuPresenter.getMenuView(this);
            if (mSplitView != null) {
                final ViewGroup oldParent = (ViewGroup) menuView.getParent();
                if (oldParent != null && oldParent != mSplitView) {
                    oldParent.removeView(menuView);
                }
                menuView.setVisibility(getAnimatedVisibility());
                mSplitView.addView(menuView, layoutParams);
            } else {
                // We'll add this later if we missed it this time.
                menuView.setLayoutParams(layoutParams);
            }
        }
        mMenuView = menuView;
    }

    private void configPresenters(MenuBuilder builder) {
        if (builder != null) {
            builder.addMenuPresenter(mActionMenuPresenter);
            builder.addMenuPresenter(mExpandedMenuPresenter);
        } else {
            mActionMenuPresenter.initForMenu(mContext, null);
            mExpandedMenuPresenter.initForMenu(mContext, null);
            mActionMenuPresenter.updateMenuView(true);
            mExpandedMenuPresenter.updateMenuView(true);
        }
    }

看红字加粗部分,这是实例化ActionMenuPresenter方法的过程,原来如此!我们只要把ActionBarView中修改mActionMenuPresenter的值即可,废话少说,修改MainActivity的setOverflowShowingAlway()方法如下:

	private void setOverflowShowingAlway(){
		try{
			if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.HONEYCOMB){   // android3.0以后的版本才存在sHasPermanentMenuKey属性
				ViewConfiguration config = ViewConfiguration.get(this);
				Field menuKeyField = ViewConfiguration.class
						.getDeclaredField("sHasPermanentMenuKey");
				menuKeyField.setAccessible(true);
				menuKeyField.setBoolean(config, false);
			} else {
				// 获取actionBarView
				final ActionBarView actionBarView = (ActionBarView) findViewById(android.support.v7.appcompat.R.id.action_bar);
				MenuPresenter.Callback menuCallback = new MenuPresenter.Callback() {

					@Override
					public boolean onOpenSubMenu(MenuBuilder subMenu) {
						android.view.Window.Callback cb = getWindow().getCallback();
			            if (cb != null) {
			                cb.onMenuOpened(Window.FEATURE_ACTION_BAR, subMenu);
			                return true;
			            }
			            return false;
					}

					@Override
					public void onCloseMenu(MenuBuilder menu, boolean allMenusAreClosing) {
						closeOptionsMenu();
					}
				};

				Field menuPresenterField = actionBarView.getClass().getSuperclass().getDeclaredField("mActionMenuPresenter");
				menuPresenterField.setAccessible(true);
				final ActionMenuPresenter menuPresenter = new ActionMenuPresenter(this);
				menuPresenter.setReserveOverflow(true);  // 这句是关键,设置overflow可见
				menuPresenter.setCallback(menuCallback);
				menuPresenter.setId(android.support.v7.appcompat.R.id.action_menu_presenter);
				// 修改actionBarView.mActionMenuPresenter=menuPresenter;
				menuPresenterField.set(actionBarView, menuPresenter);

				Field expandedMenuPresenterField = actionBarView.getClass().getDeclaredField("mExpandedMenuPresenter");
				expandedMenuPresenterField.setAccessible(true);
				Constructor contructor = Class.forName("android.support.v7.internal.widget.ActionBarView$ExpandedActionViewMenuPresenter").getDeclaredConstructor(actionBarView.getClass());
				contructor.setAccessible(true);
				Object expandedMenuPresenter = contructor.newInstance(actionBarView);
				// 修改actionBarView.mExpandedMenuPresenter=expandedMenuPresenter;
				expandedMenuPresenterField.set(actionBarView, expandedMenuPresenter);
			}
		} catch(Exception e){
			e.printStackTrace();
		}
	}

以上代码首先判断sdk版本是否是android3.0之后的版本,如果是则直接反射修改ViewConfiguration的sHasPermanentMenuKey的值;否则查找出ActionBarView,替换该对象的mActionMenuPresenter及mExpandedMenuPresenter的值,其中mActionMenuPresenter需要设置setReserveOverflow(true),也就是ActionMenuPresenter的mReserveOverflow=true,mReserveOverflowSet=true,这样就能保证程序在运行到ActionMenuPresenter的initForMenu方法时,不z再获取ActionBarPolicy的showsOverflowMenuButton()的返回值作为判断是否增加overflow按钮的依据。

重新运行,呵呵,overflow按钮可以出来了,点击overflow按钮也出现了下来菜单,但是菜单只有文字没有显示图标,并且按物理menu键菜单还是显示在下边。经过分析,原来是android3.0之前的类com.android.internal.policy.impl.PhoneWindow并没有任何ActionBar的代码,而在android3.0以后的版本中增加了不少ActionBar代码,修改MainActivity的onMenuOpened(int featureId, Menu menu)方法如下:

	@Override
	public boolean onMenuOpened(int featureId, Menu menu) { 

		if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.HONEYCOMB){   // android3.0以后的版本,参数menu不为空,直接通过反射方法修改setOptionalIconsVisible的值
			if(featureId == Window.FEATURE_ACTION_BAR){
				setOptionalIconsVisible(menu);
			}
		    return super.onMenuOpened(featureId, menu);
		} else {
			ActionBarView actionBarView = (ActionBarView) findViewById(android.support.v7.appcompat.R.id.action_bar);
			// 通过点击overflowButton时,传入的参数featureId为FEATURE_ACTION_BAR,而通过点击menu按键,传入的参数featureId为FEATURE_OPTIONS_PANEL
			if(featureId == Window.FEATURE_ACTION_BAR){
				// android3.0之前的版本,由于phonewindow的机制,导致传进的menu是空的,需要把menu赋值为ActionMenuPresenter.mMenu
				if(menu == null){
					try{
						Field menuPresenterField = actionBarView.getClass().getSuperclass().getDeclaredField("mActionMenuPresenter");
						menuPresenterField.setAccessible(true);
						ActionMenuPresenter menuPresenter = (ActionMenuPresenter) menuPresenterField.get(actionBarView);
						Field menuField = BaseMenuPresenter.class.getDeclaredField("mMenu");
						menuField.setAccessible(true);
						menu = (Menu) menuField.get(menuPresenter);
					} catch(Exception e){
						e.printStackTrace();
					}
				}
				setOptionalIconsVisible(menu);
			    return super.onMenuOpened(featureId, menu);
			} else {
				actionBarView.showOverflowMenu();  // 把下拉菜单显示到ActionBar上
				return false;
			}
		}
	} 

以上代码首先判断首先判断sdk版本是否是android3.0之后的版本,如果是则直接反射修改menu的setOptionalIconsVisible;否则根据传入的参数featureId是否等于Window.FEATURE_ACTION_BAR来判断用户是通过点击overflow按钮还是点击物理menu键触发的,如果是通过overflow按钮触发的,则其featureId为Window.FEATURE_ACTION_BAR,但是menu=null,后面根据发射方法对menu进行赋值,并修改menu的setOptionalIconsVisible=true;如果是通过点击物理menu键触发的,则其featureId为Window.FEATURE_OPTIONS_PANEL,则调用ActionBarView的showOverflowMenu()方法,把菜单挂接到overflow下。

至此所有修改已完成,我们看一下在android2.3环境下运行效果:

源代码下载,请点击这里

时间: 2024-11-14 02:02:02

android2.x使用ActionBar的总结的相关文章

Android title和actionbar的区别

我想在一个页面的顶端放入两个按钮,应该用title还是actionbar.他们两个什么区别?分别该什么时候用? 答: android title 是UI上的一小部分,它支持Text和Color,你可以在上面设置文本信息作为title,还可以设置背景颜色,不过这些大部分在android2.0的app上应用. action bar则是现在android app应用中主要的导航控件,它上面可以包含一些按钮和导航信息,还可以为Activity添加action,显示app的title,或者是一些链接,ac

Android学习路线(二十四)ActionBar Fragment运用最佳实践

通过前面的几篇博客,大家看到了Google是如何解释action bar和fragment以及推荐的用法.俗话说没有demo的博客不是好博客,下面我会介绍一下action bar和fragment在实战中的应用,以及相关demo源码,希望和大家相互交流. 了解过fragment的同学们应该都知道,fragment是android 3.0版本才出现的的,因此如果要在支持android 3.0一下版本的工程中使用fragment的话是需要添加Support Library的.具体如何添加我就不再赘述

actionbar、slidingmenu、fragment的使用 day03

1. FrameAnimation 原理:多个关键帧按照顺序快速(100毫秒)切换 三个要素:图片/顺序/时间 2. TweenAnimation 原理:系统通过改变View的大小 位置 角度 透明度 code和xml创建Animation xml:简单,不可动态改变 code:灵活,可以动态改变 缺点:只是视图上改变了控件,控件实际的位置不变 3. PropertiesAnimation 能够完全替代TweenAnimation,并且是真正的移动了控件的位置 使用Nineold开源项目,支持1

Android 开源项目android-open-project解析之(一) ListView,ActionBar,Menu,ViewPager,Gallery

一.ListView android-pulltorefresh 一个强大的拉动刷新开源项目,支持各种控件下拉刷新,ListView.ViewPager.WebView.ExpandableListView.GridView.ScrollView.Horizontal ScrollView.Fragment上下左右拉动刷新,比下面johannilsson那个只支持ListView的强大的多.并且它实现的下拉刷新ListView在item不足一屏情况下也不会显示刷新提示,体验更好. 项目地址:ht

ActionBar效果图,功能一览

一.概述 1.App icon 应用的图标,左侧带应用相当于back返回键 2.ViewControl 3.Action button 相当于普通的Button可以监听点击事件 4.Action overflow 三个点,相当于手机上的menu键,可以显示隐藏的action button 二. 显示情景 1. 屏幕空间有限,这就好理解actionbar中的showAsAction中的属性了.决定什么情景要不要在顶部显示.   2. 但是就算是屏幕很大有时候还是无法显示全部,这时候就要用到一种的第

ActionBar 自定义布局定义

Android系统中ActionBar默认的布局不美观且难于控制,通过为ActionBar自定义布局的方式可以灵活控制ActionBar. 效果: 工具/原料 android集成开发环境eclipse.ADT android sdk 3.0及以上 方法/步骤 自定义Activity主题和ActionBar样式 在新建的android工程的res/values/styles.xml添加自定义ActionBar样式的代码和自定义Activity主题的代 码,并在AndroidMainfest.xml

Android ActionBar详解

关于ActionBar,相信大家并不陌生,但是真正能够熟练使用的也不是很多,这篇文章主要为大家详细介绍ActionBar的相关知识,ActionBar是在Android3.0中引入的概念,所以在2.x系统中使用ActionBar我们需要依赖ActionBarSherklock或者androi-support-v7库,ActionBarSherklock是anroid中非常有名的一个开源项目,android-support-v7是Google后来推出的一个库,有了v7库后AndroidBarShe

用BadgeView在actionbar menu上显示提醒信息

有时候需要在actionbar menu上显示消息个数,所以可以用BadgeView来实现. 实现方法是获取actionbar menuitem的view,然后创建BadgeView.注意,通常只能在Optionsmenu创建完成之后去获取menuitem的view.我们可以在onCreate方法中延时1秒去处理. <menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="ht

告别ActionBarSherlock——Android.support包也能打造兼容2.x的ActionBar(1)

http://www.bdqn.cn/news/201308/10625.shtml 摘要: 告别ActionBarSherlock——android.support包也能打造兼容2.x的ActionBar(1) ActionBar是Android 3.0的产物 一直延伸到现在最新的4.3 就个人而言 ActionBar相比传统的弹出式菜单 更加简洁 但是ActionBar只有API 10以上(包括API 10)才能尝到 于是有些大神便打造出了ActionBarSherlock,为2.x带来了一