Action Bar 是Google 在Android 3.0之后推出的一种全新用户操作方式,目的是替换手机设备上的menu键,用来替换掉菜单按键功能,长按操作功能,提供一种全新的操作体验,我们可以对比下下面的二张图:
而且这样也对我们程序员方便统一开发,
actionBar一共有四大部分:我在这图上做了标记,很清晰的看清楚actionbar为我们提供了那些方便的操作:
下面分别说下这四个部分的作用:
1: app 图标:包含了 图标,主标题,副标题,回退部分
2.:视图控件:允许用户切换视图。视图切换控件的样式有下拉菜单
或选项卡
控件,d对应了,标准
,list
,tab
3:种导航模式 3. 操作按钮:在操作栏里,展示出你的 app 中最重要的操作。不能展示在操作栏里的操作,可以自动移到“更多操作”里
4:更多操作:把不常用的操作放到更多操作里
那我们想使用actionbar,该怎么用呢?
google android sdk默认支持3.0以上,也有个开源的框架也对actionbar做了支持,这个框架是actionbarSherlock,但是如果能用系统的那当然更好了,
google 2013 i/o大会.在v7(api level 7_android2.1以上)中对actionbar进行了兼容,
我们在高版本创建一个android项目时,就自动帮我们引入了appcompat_v7这个library,
使用actionbar简单的分为三步:
1:第一步在你的项目中引入v7包
2:让你要使用的activity继承v7包中的ActionBarActivity
3:修改主题,主题需要是v7下的@style/Theme.AppComp.XXX,
这样就简单的可以使用actionbar了
看下我运行起来的界面:
刚才讲了actionbar有四部分:
现在讲下第一部分是关于图标 标题以及返回键的问题,常用的api如下:我都写好了注释,看起来应该不成问题的:
public class TitleActivity extends ActionBarActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_title);
ActionBar actionBar = getSupportActionBar();//获取v7包中的actionbar
actionBar.setLogo(R.drawable.app_icon);//设置logo,也就是我们标题栏坐标的那个图标
actionBar.setIcon(R.drawable.album);
actionBar.setTitle("刘德华");//设置标题
actionBar.setSubtitle("梁兆伟");//设置子标题
actionBar.setDisplayUseLogoEnabled(false);//设置logo的优先级
actionBar.setDisplayHomeAsUpEnabled(true);//设置是否显示返回按钮
actionBar.setDisplayShowTitleEnabled(false);//设置标题栏文字和子标题栏不可见
actionBar.setDisplayShowHomeEnabled(false);//设置图标不可见 也就是我们设置的logo或者icon不可见
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home://点击返回
finish();
break;
}
return super.onOptionsItemSelected(item);
}
}
前面说的actionbar第二部分就是关于action把它视图控件部分,它有三个模式:分别是
1:标准模式,默认情况下就是标准模式
2:List模式
3:Tab模式
可能有的人不知道这个视图是啥东西:我们可以写一行代码然后运行下看效果就知道了,
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);这个是设置视图为list模式:如图
这个就是视图了,只是我们设置了list模式,没填充数据,如果有数据的情况下,点击它就好像是一个popwindow一样的效果:
现在我们来给它设置一些数据,再看看,会是什么效果
ArrayList<String> datas = new ArrayList<>();
datas.add("新闻");
datas.add("体育");
datas.add("财经");
datas.add("杭州");
ActionBar actionBar = getSupportActionBar();//获取v7包中的actionbar
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);
ArrayAdapter<String> adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, datas);
//设置adapter以及list模式的点击事件的回调
actionBar.setListNavigationCallbacks(adapter, new OnNavigationListener() {
@Override
public boolean onNavigationItemSelected(int arg0, long arg1) {
return false;
}
});
这是给list模式设置了数据,然后我们再看下效果:
默认显示是第一个,当你点击下面的哪一个就给你显示哪一个了,这就是我们的list模式,是不是和popwindow效果一样,只是做起来比popwindow简单而已,但是好像你想
改变显示的UI没popwindow方便,
现在再看下tab模式,
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);//设置tab模式,看下效果什么样:
现在我们给它设置数据,再看看他是什么样的展现形式:
/************************tab模式***************************/
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);//设置tab模式
Tab tab1 = actionBar.newTab();
tab1.setText("tab1");//设置tab上的文字
tab1.setIcon(R.drawable.app_icon);//设置tab图标
Tab tab2 = actionBar.newTab();
tab2.setText("tab2");//设置tab上的文字
tab2.setIcon(R.drawable.app_icon);//设置tab图标
Tab tab3 = actionBar.newTab();
tab3.setText("tab3");//设置tab上的文字
tab3.setIcon(R.drawable.app_icon);//设置tab图标
Tab tab4 = actionBar.newTab();
tab4.setText("tab4");//设置tab上的文字
tab4.setIcon(R.drawable.app_icon);//设置tab图标
Tab tab5 = actionBar.newTab();
tab5.setText("tab5");//设置tab上的文字
tab5.setIcon(R.drawable.app_icon);//设置tab图标
Tab tab6 = actionBar.newTab();
tab6.setText("tab6");//设置tab上的文字
tab6.setIcon(R.drawable.app_icon);//设置tab图标
tab1.setTabListener(new TabListener() {//这个点击事件一定要设置 否则报错
@Override
public void onTabUnselected(Tab arg0, FragmentTransaction arg1) {
}
@Override
public void onTabSelected(Tab arg0, FragmentTransaction arg1) {
}
@Override
public void onTabReselected(Tab arg0, FragmentTransaction arg1) {
}
});
tab2.setTabListener(new TabListener() {//这个点击事件一定要设置 否则报错
@Override
public void onTabUnselected(Tab arg0, FragmentTransaction arg1) {
}
@Override
public void onTabSelected(Tab arg0, FragmentTransaction arg1) {
}
@Override
public void onTabReselected(Tab arg0, FragmentTransaction arg1) {
}
});
tab3.setTabListener(new TabListener() {//这个点击事件一定要设置 否则报错
@Override
public void onTabUnselected(Tab arg0, FragmentTransaction arg1) {
}
@Override
public void onTabSelected(Tab arg0, FragmentTransaction arg1) {
}
@Override
public void onTabReselected(Tab arg0, FragmentTransaction arg1) {
}
});
tab4.setTabListener(new TabListener() {//这个点击事件一定要设置 否则报错
@Override
public void onTabUnselected(Tab arg0, FragmentTransaction arg1) {
}
@Override
public void onTabSelected(Tab arg0, FragmentTransaction arg1) {
}
@Override
public void onTabReselected(Tab arg0, FragmentTransaction arg1) {
}
});
tab5.setTabListener(new TabListener() {//这个点击事件一定要设置 否则报错
@Override
public void onTabUnselected(Tab arg0, FragmentTransaction arg1) {
}
@Override
public void onTabSelected(Tab arg0, FragmentTransaction arg1) {
}
@Override
public void onTabReselected(Tab arg0, FragmentTransaction arg1) {
}
});
tab6.setTabListener(new TabListener() {//这个点击事件一定要设置 否则报错
@Override
public void onTabUnselected(Tab arg0, FragmentTransaction arg1) {
}
@Override
public void onTabSelected(Tab arg0, FragmentTransaction arg1) {
}
@Override
public void onTabReselected(Tab arg0, FragmentTransaction arg1) {
}
});
actionBar.addTab(tab1);
actionBar.addTab(tab2);
actionBar.addTab(tab3);
actionBar.addTab(tab4);
actionBar.addTab(tab5);
actionBar.addTab(tab6);
就是这种效果,我现在项目中也有这种效果,但是不会使用actionbar去做,而是使用了一个开源的框架PagerSlidingTabStrip
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
return super.onCreateOptionsMenu(menu);
}
相当于我们之前显示在上面的tab,显示到下面来了,这里还会涉及到一个版本兼容的问题,如果在3.0版本下使用这个还得在
但是很奇怪的是我在平板上,这个显示不了,不知道什么原因
一直说actionbar是替换我们menu键而产生的,现在我们要讲下它是怎么替换掉menu键的
先复写onCreateOptionsMenu()方法,然后添加menu布局
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
return super.onCreateOptionsMenu(menu);
}
在res/menu/打开main.xml文件:
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
tools:context="com.zhimore.actionbar.MainActivity" >
<item
android:id="@+id/action_men1"
android:orderInCategory="100"
android:title="menu--1"
app:showAsAction="always"/>
<item
android:id="@+id/action_men2"
android:title="menu--2"
app:showAsAction="always"/>
<item
android:id="@+id/action_men3"
android:title="menu--3"
app:showAsAction="always"/>
</menu>
运行起来看效果:
这里有一个重要的属性就是app:showAsAction它会在你设置的菜单太多时,会根据这个属性怎么显示的:
ShowAction的取值说明:__
always : 总是显示
ifroom : 如果放的下去,就显示(溢出菜单)
never : 从不显示
withText: 和文本一起显示
collapseActionView: 折叠显示
如果你设置了ifroom 就是当菜单栏上显示不了会收起来,假如你手机设备上有menu键的话,点击会把没显示出来的menu显示出来,假如你手机设备上没
menu键 它在右边显示 三点,然后你点击这三个点就可以把其他没显示出来的menu菜单,给你显示出来,
它的点击事件要复写
@Override
public boolean onOptionsItemSelected(MenuItem item)
{
return super.onOptionsItemSelected(item);
}
然后就像我们在一个布局中找button按钮一样,在这就不多提了,ok了,actionbar常用的就讲到这里