Android控件ActionBar浅析及适配2.x的方法介绍

概述:

在Honeycomb版本系统中,Android引入了全新的操作栏。操作栏不仅取代了显示标题和应用图标的传统标题栏(title bar),还带来了更多其他的功能,例如,安置菜单选项、配置应用图标作为导航按钮,等等。——《Android编程权威指南》

优点:

1.使用方便,避免开发者重复制造轮子。

2.框架成熟,不需要开发者再去做多余的适配不同分辨率及碎片化优化操作。

正常使用(API14及以上):

代码及思路分析:

正常情况下的我们是通过Java代码和xml代码组合来编写actionbar。

xml文件如下:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >

    <item
        android:id="@+id/action_compose"
        android:icon="@drawable/delete_button_normal"
        android:showAsAction="always"
        android:title="@string/action_compose"/>

    <item
        android:id="@+id/action_delete"
        android:icon="@drawable/delete_button_normal"
        android:showAsAction="always"
        android:title="@string/action_delete"/>

    <item
        android:id="@+id/action_settings"
        android:icon="@drawable/delete_button_normal"
        android:showAsAction="always"
        android:title="@string/action_settings"/>

</menu>

定义3个item,设置其showAsAction属性为always.

关于showAsAction属性的值有以下几个:

always:    这个值会使菜单项一直显示在Action Bar上

ifRoom:    如果有足够的空间,这个值会使菜单项显示在Action Bar上

never:     这个值使菜单项永远都不出现在Action Bar上

withText:  这个值使菜单项和它的图标,菜单文本一起显示

看到上面的标签为menu,就应该知道了,到上面在java代码中是通过菜单来实现了。主要的方法是onCreateOptionsMenu,如下:

public boolean onCreateOptionsMenu(Menu menu) {
		MenuInflater inflater = getMenuInflater();
		inflater.inflate(R.menu.menu, menu);
		return true;
	}

为了去响应左边的返回键(箭头)和Home需要我们在代码做以下逻辑:

ActionBar bar = getActionBar();
bar.setHomeButtonEnabled(true);
bar.setDisplayHomeAsUpEnabled(false);
bar.setDisplayShowHomeEnabled(true);

还有一点就是Home的图标,我们可以在manifest的activity标签中去设置,如下:

<activity
            android:name="com.actionbar.activity.MainActivity"
            android:label="@string/action_bar_title"
            android:logo="@drawable/back_button_normal" >

            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

实现效果展示:

注:有时候我们在屏幕足够大的时候还是会在最左侧出现一个小箭头,那么如何除掉Actionbar最左侧的箭头呢?可以点击这里查看解决方法。

适配2.x版本:

代码及思路分析:

对于上面的逻辑方法只是可以在API 14及以上的系统上实现。那么API 14以下的系统要怎么去实现同样的效果呢?在官方出台新的解决方案之前,就有一些大神开始研究且开发出了一套框架——ActionBarSherlock。当然目前Google已经就这个问题提供了一个新的解决方案——android-support-v7-appcompat。我们可以让我们的Activity继承自ActionBarActivity,不过不担心这个ActionBarActivity会对代码有没有什么不良的影响,因为它是继承自FragmentActivity。

那么要怎么实现呢?我们需要引入一个工具包:android-support-v7-appcompat,并在Android的项目中导入它。是不是到这里就已经大功告成了呢?运行程序后,我们发现并非如此。可是,在基有的代码上我们没有发现任何蛛丝马迹,那我们要怎么去修改这个Bug呢?google吧,孩子。

后来我们发现我们不能再使用静态的xml代码来创建它了。我们只能动态的在Java代码中通过Java代码动态生成Item,如下:

public boolean onCreateOptionsMenu(Menu menu) {
//		MenuInflater inflater = getMenuInflater();
//		inflater.inflate(R.menu.menu, menu);
//		return super.onCreateOptionsMenu(menu);

		MenuCompat.setShowAsAction(menu.add("First").setIcon(android.R.drawable.btn_star), MenuItemCompat.SHOW_AS_ACTION_ALWAYS);
		MenuCompat.setShowAsAction(menu.add("Second").setIcon(android.R.drawable.ic_menu_rotate), MenuItemCompat.SHOW_AS_ACTION_ALWAYS);
		return true;
	}

注释掉的部分就是通过xml静态地创建,事实证明是失败的,需要动态来创建。

运行效果图展示:

本人文笔拙劣,可能会有一些表述不够清晰。更详细的代码和细节请在下面的源码连接中去下载查看。还有一点需要注意,如果你的测试机是魅族系列,可能有些地方不能很好适配,请更换测试机重新测试或将属性参数改为SHOW_AS_ACTION_ALWAYS(我用的也是魅族)。

源码下载:

http://download.csdn.net/detail/u013761665/8737119

时间: 2024-10-10 14:01:26

Android控件ActionBar浅析及适配2.x的方法介绍的相关文章

Robotium之Android控件定位实践和建议(Appium/UIAutomator姊妹篇)

本人之前曾经撰文描述Appium和UIAutomator框架是如何定位Android界面上的控件的. UIAutomator定位Android控件的方法实践和建议 Appium基于安卓的各种FindElement的控件定位方法实践和建议 今天我们换一个渊源更留长,当今更盛行的框架Robotium,实践下看它又是如何对控件进行定位的. 1. 背景 为保持这个系列的一致性,我们继续用SDK自带的NotePad实例应用作为我们的试验目标应用,但是这次不仅仅是像以前一样主要围绕Menu Option里面

android控件开发之AutoCompleteTextView

android控件开发之AutoCompleteTextView 此控件主要是用在当客户需要输入某些内容时,会提示补全信息供用户选择,用以减少客户的输入操作 此控件中的选择数据,可以是自定义的String数组数据,也可以是list列表数据 JAVA代码: package com.example.autocompletetext; import java.util.ArrayList; import android.os.Bundle; import android.app.Activity; i

Android控件介绍

Android控件介绍 多选按钮(CheckBox) CheckBox有两个常用的事件,OnClickListener事件和OnClickChangeListener事件 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_w

Android控件(2)RadioButton&amp;RadioGroup

抄自: http://www.cnblogs.com/wt616/archive/2011/06/20/2085531.html 学习目的: 1.掌握在Android中如何建立RadioGroup和RadioButton 2.掌握RadioGroup的常用属性 3.理解RadioButton和CheckBox的区别 4.掌握RadioGroup选中状态变换的事件(监听器) RadioButton和CheckBox的区别: 1.单个RadioButton在选中后,通过点击无法变为未选中 单个Che

Android 控件的触摸事件传递与处理

了解Android控件的触摸事件传递与处理对我们日常开发中自定义控件和触摸事件冲突解决有重大意义.Android控件的触摸事件传递和处理主要有以下几个方法,下面一一介绍. 一.与触摸事件有关的几个方法 boolean dispatchTouchEvent(MotionEvent ev);                                                                                               接收到触摸事件时,是否

Android 控件:使用下拉列表框--Spinner

---恢复内容开始--- 一.前段代码 <Spinner android:id="@+id/spin" android:paddingTop="10px" android:layout_width="fill_parent" android:layout_height="50sp"/> <Button android:id="@+id/addList" android:layout_wid

android控件篇:ViewPager+Fragment+GridView的使用(与AndroidQuery框架结合)

最近看了一个AndroidQuery的框架,里面的Demo,有个界面,让博主很喜欢.左右滑动十分顺畅,手感很好,于是拿来和大家分享一下.先看一下效果图: 从图中可以看出,上面的布局是一个Layout里面嵌套有个ViewPager,ViewPager中包含着Fragment,Fragment的布局文件包含了一个简单的GridView,GridView的Item布局很简单,就是一个100*100大小的图片.好啦,先说这么多,然后咱们看代码吧. 最外层Activity的布局文件 <?xml versi

Android 控件布局常用属性

<!--单个控件经常用到android:id -- 为控件指定相应的IDandroid:text -- 指定控件当中显示的文字,需要注意的是,这里尽量使用strings.xml文件当中的字符串android:grivity -- 指定控件的基本位置,比如说居中,居右等位置android:textSize -- 指定控件当中字体的大小android:background -- 指定该控件所使用的背景色,RGB命名法 android:width -- 指定控件的宽度android:height --

Android控件上添加图片

项目中有一个点赞功能,点赞的小图标添加在点赞列表旁边,在xml里可以进行设置,也可以在代码中进行绘图. 下面是两种方法的设置: 1.xml里:一些控件:button.textView等等里面有个属性是android:drawableLeft 就可以将pic设置到text的左边.good.... 2.代码中: TextView txtlikedList = new TextView(this.getContext()); Drawable drawable= getResources().getD