Action Bar 是一个标识应用程序和用户位置的窗口功能,并且给用户提供操作和导航模式。在大多数的情况下,当需要突出展现用户行为或全局导航的 Activity 中使用 Action Bar,因为其能够使应用程序给用户提供一致的界面,并且系统能够很好根据不同的屏幕配置来适应操作栏的外观
本文主要内容包括:
1.建立Action bar
2.添加Action按钮
3.ActionBar的覆盖叠加
4.设置Action view 的样式
5.使用ActionProvider
详细代码:github.com/Baolvlv/LearnAndroid/tree/master/ActionBarUsing
一、建立Action bar
(1)从 Android 3.0(API lever 11) 开始,所有默认主题的 Activity 都包含了 action bar。如果创建了一个自定义主题,需确保这个主题使用一个 Theme.Holo的主题作为父类。
( 2 )使用v7 appcompat支持库的Toolbar
使用支持库的工具栏有助于确保您的应用在最大范围的设备上保持一致的行为。如,Toolbar小部件能够在运行 Android 2.1(API 级别 7)或更高版本的设备上提供Material Design体验,但除非设备运行的是 Android 5.0(API 级别 21)或更高版本,否则原生操作栏不会支持 Material Design。
1.确保Activity可继承自AppCompatActivity
MainActivityextendsAppCompatActivity
2.在manifest文件中,application的主题使用NoActionBar主题,避免使用原生ActionBar类提供的应用栏
android:theme="@style/Theme.AppCompat.Light.NoActionBar”>
3.向activity布局文件中添加1个Toolbar
android:id="@+id/my_toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
设置应用栏仰角为4dp
android:elevation=“4dp"
可设置其悬浮外观
android:theme="@style/ThemeOverlay.AppCompat.ActionBar"
app:popupTheme="@style/ThemeOverlay.AppCompat.Dark”/>
4.在onCreate方法中将工具栏设为应用栏
//将工具栏设为Activity的应用栏
Toolbar myToolBar = (Toolbar) findViewById(R.id.my_toolbar);
setSupportActionBar(myToolBar);
二、添加Action按钮
在res目录下新建menu文件夹,在menu文件夹下新建XML文件添加Action按钮
每一个item子标签为一个按钮,可设置图标与标题
android:icon="@drawable/ic_action_search"
android:title="@string/action_search"
可设置按钮作为action显示还是隐藏在overflow中,ifRoom为如果有空间,显示在应用栏中,如果没有空间,显示在overflow中
app:showAsAction="ifRoom”
注意:使用支持库时,showAsAction属性需要使用自己的命名空间,app
xmlns:app="http://schemas.android.com/apk/res-auto">
如果一直显示在overflow中,属性址为never
app:showAsAction=“never"
添加菜单条目,使ActionBar扩展菜单项
//为ActionBar扩展菜单项
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.actions,menu);
为按钮添加响应事件,重写onOptionsItemSelected方法
通过getItemId获取响应的id,处理不同情况
switch(item.getItemId()){
caseR.id.action_search:
// WebView wb = (WebView) findViewById(R.id.searchView);
// wb.loadUrl("http://baidu.com");
return true;
caseR.id.action_settings:
Toast.makeText(MainActivity.this,"setting",Toast.LENGTH_SHORT).show();
return true;
}
为Activity设置up button
当主activity不位于屏幕时,提供返回到逻辑父屏的返回按钮
首先为子activity声明父级activity
android:parentActivityName=“.MainActivity">
然后在程序中设置为可用的向上按钮
//为Activity设置向上button
ActionBar ab = getSupportActionBar();
ab.setDisplayHomeAsUpEnabled(true);
当用户按下向上按钮时,系统会导航到恰当的父 activity - 你不需要去处理向上按钮的事件。
三、ActionBar的覆盖叠加
默认情况下,action bar 显示在 activity 窗口的顶部,会稍微地减少其他布局的有效空间。
调用ActionBar中的hide()和show()来实现。但是,这将导致 activity 基于新尺寸重新计算与绘制布局。可以为 action bar 启用叠加模式(overlay mode)。在叠加模式下,所有可用的空间都会被用来布局就像ActionBar不存在一样,并且 action bar 会叠加在布局之上。
android 3.0以上:
parent="@android:style/Theme.Holo">
support v7库
parent="@android:style/Theme.AppCompat">
为了确保这些布局始终位于 action bar 下部,可以使用actionBarSize属性来指定顶部margin或padding的高度来到达。
android 3.0以上
http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingTop="?android:attr/actionBarSize">
support v7库
http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingTop="?attr/actionBarSize">
四、设置Action view 的样式
在每个按钮Item标签下,设置action的样式,添加actionViewClass设置其样式属性。如设置成为点击之后,自动变成可输入文本的搜索框
android:icon="@drawable/ic_action_search"
android:title="@string/action_search"
app:showAsAction="ifRoom|collapseActionView"
app:actionViewClass="android.support.v7.widget.SearchView”/>
而后在onCreateOptionMenu中查找到该Action并设置其搜索功能
//查找到searchView的Action
MenuItem searchItem = menu.findItem(R.id.action_search);
SearchView searchView =
(SearchView) MenuItemCompat.getActionView(searchItem);
设置searchView的事件监听器,实现提交查询文本与查询文本改变的方法
//设置searchView的事件监听器
searchView.setOnQueryTextListener(newSearchView.OnQueryTextListener() {
//此方法执行实际的查询
//提交查询文本的方法
@Override
public booleanonQueryTextSubmit(String query) {
//实际应用中应该在该方法内执行实际查询
//此处仅使用Toast显示用户输入的查询内容
Toast.makeText(MainActivity.this,"您选择的是:"+query,Toast.LENGTH_SHORT).show();
return true;
}
//查询文本改变时执行的方法
@Override
public booleanonQueryTextChange(String newText) {
if(TextUtils.isEmpty(newText)){
// 清除过滤
lv.clearTextFilter();
}else{
//根据用户内容进行过滤
lv.setFilterText(newText);
}
return true;
}
});
五、使用ActionProvider
使用ActionProvider为Action提供功能,例如分享
1.在action的xml文件item标签下添加actionProviderClass
android:title="@string/share"
app:showAsAction="ifRoom"
app:actionProviderClass="android.support.v7.widget.ShareActionProvider"/>
2.在onCreateOptionMenu方法下,查找到分享按钮,并设置其分享内容
//查找到分享ActionBar,并设置分享内容
MenuItem shareItem = menu.findItem(R.id.action_share);
ShareActionProvider mShareActionProvider = (ShareActionProvider) MenuItemCompat.getActionProvider(shareItem);
mShareActionProvider.setShareIntent(getDefaultIntent());
3.编写分享内容的函数,调用程序中所有可以分享图片的应用
//调用程序中所有发送图片的应用程序
privateIntentgetDefaultIntent(){
//设置为发送信息的intent
Intent intent =newIntent(Intent.ACTION_SEND);
//设置intent的发送类型为图片
intent.setType("image/*");
returnintent;
}