- 什么是ActionBar
- Android3.0以后出现的一个API专门用来开发应用顶部的ActionBar
- 他是一个显示在屏幕顶部的控件,它可以在顶部的左边显示应用的logo图标和右边的一些操作菜单(如:搜索)
- Google攻城狮在开发ActionBar API的同时,也开发了好多辅助功能,比如抽屉,可以在顶部控制抽屉的开关;Tab标签;等等,下面会介绍一些常用的功能;
创建ActionBar
- 由于ActionBar是Android3.0之后出现的API,所以,默认只最低兼容3.0以上的设备。即在AndroidManifest.xml配置文件中,我们配置的最低版本号应为11
<manifest ... >
<uses-sdk android:minSdkVersion="11" ... />
...
</manifest>
- 但是想兼容3.0以下2.1以上的也不是不可以,哈哈哈,但是需要引入一个V7 appcompat libryary包。和V4包有点像,但他两一点关系也没有,别混淆。这个包在我们的SDK的目录下已经有了
"开发工具安装根目录\sdk\extras\android\m2repository\com\android\support"
不过这个我感觉用着不爽,这个还行,可以在里面看到源码V7 appcompat libryary免费下载地址
- 如何给当前项目添加支持库(添加libryary包):
- 将V7包解压后,Import进我们的eclipse中;
- 然后,在我们当前项目名上点击右键;
- 在弹出的右键菜单中,选择倒数第二个的”Properties”(左键点击项目名后直接按Alt+Enter键也可以);
- 接下来,在左边的条目栏中选择第二个”Android”;
- 在右边的窗口中,下拉到最底部;
- 在Library模块下选择ADD,在弹出的对话框中选择”android-support-v7-appcompat”;
- 然后一路点击OK就可以了。
- 注意应如后有可能会有V4包的版本冲突,将两个工程都调成一样的就可以了
- 如何给当前项目添加支持库(添加libryary包):
- 我们导入了V7包之后就可以正式进行ActionBar的创建了
- 在MainActivity中继承ActionBarActivity
- 在AndroidManifest.xml文件中修改主题
在application标签下,吧android:theme=”“中的值设为Theme.AppCompat主题中的一个,我们选择
<activity android:theme="@style/Theme.AppCompat.Light" ... >
现在一个简单的ActionBar就建成功了:
接下来我们将对其进行一步步的定制
ActionBar搜索按钮
- 在上面的图片中,可以看到右上角是一个菜单键,点击会弹出菜单项。所以,这其实就是菜单按钮
一、配置main.xml:到res文件夹下的menu文件夹里的main.xml文件里,是在那定义了菜单键,我在教程上拷贝如下代码:
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
<!-- Search, should appear as action button(搜索键的配置) -->
<item android:id="@+id/action_search"
android:icon="@drawable/ic_action_search"
android:title="@string/action_search"
android:showAsAction="ifRoom" />
<!-- Settings, should always be in the overflow(设置键的配置) -->
<item android:id="@+id/action_settings"
android:title="@string/action_settings"
android:showAsAction="never" />
</menu>
在上面的代码块中,第一个Item是配置搜索键的,第二个Item是配置设置键的,我们只想要看到搜索键,所以把第二个删掉。但是这只是从官方教程上拷贝下来的,要想符合我们的要求还需进一步配置
1. 添加我们的自定义命名空间:xmlns:actionBar="http://schemas.android.com/apk/res-auto"
2. 将android:showAsAction="ifRoom"
改为actionBar:showAsAction="ifRoom
3. 在Item中添加一个V7包的配置:android:actionViewClass="android.support.v7.widget.SearchView"
最终的manu.xml配置文件
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:actionBar="http://schemas.android.com/apk/res-auto" >
<!-- Search, should appear as action button -->
<item android:id="@+id/action_search"
android:icon="@drawable/ic_action_search"
android:title="@string/action_search"
actionBar:showAsAction="ifRoom"
actionBar:actionViewClass="android.support.v7.widget.SearchView" />
</menu>
二、初始化菜单并添加逻辑
// 初始化菜单并添加逻辑
@SuppressLint("NewApi")
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
// "版本的控制",如果低于3.0版本的就不执行此方法
if(android.os.Build.VERSION.SDK_INT > 11){
SearchView searchView = (SearchView) menu.findItem(R.id.action_search).getActionView();
searchView.setOnQueryTextListener(this);// 搜索的监听
}
return true;
}
三、处理ActionBar 菜单条目的点击事件:在Activity中添加代码
/**
* 处理ActionBar的菜单条目的点击事件,以后所有在ActionBar上的东西,
* 都需要在这里处理一下
*/
@Override
public boolean onOptionsItemSelected(MenuItem item){
// Handle presses on the action bar items
if(item.getItemId() == R.id.action_search){
Toast.makeText(getApplicationContext(), "搜索", 0).show();
}
return super.onContextItemSelected(item);
}
三、 查询:在MainActivity中需要实现OnQueryTextListener类
同时需要实现两个方法
onQueryTextSubmit()
@Override public boolean onQueryTextSubmit(String query) { Toast.makeText(getApplicationContext(), "搜索提交", 0).show(); return true; }
- 介绍:
Called when the user submits the query. 当用户提交数据时调用
Returns:true if the query has been handled by the listener, false to let the SearchView perform the default action.(当查询已经被监听时返回true,默认情况下返回false,不会查询)onQueryTextChange()
@Override public boolean onQueryTextChange(String newText) { Toast.makeText(getApplicationContext(), "文本改变", 0).show(); return true; }
介绍:
Called when the query text is changed by the user.当查询文本改变时被调用
Returns:false if the SearchView should perform the default action of showing any suggestions if available, true if the action was handled by the listener.和上面的方法一样
MainActivity.java
package com.example.actionbar;
import android.os.Bundle;
import android.annotation.SuppressLint;
import android.support.v7.app.ActionBarActivity;
impor