android 世上actionbra最详细的介绍

本文详细介绍了Android中的Action Bar,包括其目的、组成部分以及如何在不同版本中实现兼容。通过实例展示了如何设置导航模式(标准、List、Tab),并替换Menu键的功能。还探讨了在平板上可能遇到的显示问题。
摘要由CSDN通过智能技术生成

Action Bar 是Google 在Android 3.0之后推出的一种全新用户操作方式,目的是替换手机设备上的menu键,用来替换掉菜单按键功能,长按操作功能,提供一种全新的操作体验,我们可以对比下下面的二张图:


而且这样也对我们程序员方便统一开发,

actionBar一共有四大部分:我在这图上做了标记,很清晰的看清楚actionbar为我们提供了那些方便的操作:


下面分别说下这四个部分的作用:

 1: app 图标:包含了 图标,主标题,副标题,回退部分

 2.:视图控件:允许用户切换视图。视图切换控件的样式有下拉菜单选项卡控件,d对应了,标准listtab

 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

现在看下actionbar的split模式,直接写代码看效果就一目了然,
首先在activity节点添加这行代码:
android:uiOptions="splitActionBarWhenNarrow"
然后要在activity中写入复写这个方法:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
return super.onCreateOptionsMenu(menu);
}
把要显示的视图加进去,如图:


相当于我们之前显示在上面的tab,显示到下面来了,这里还会涉及到一个版本兼容的问题,如果在3.0版本下使用这个还得在

activity节点下配置这个:
<meta-data android:name="android.support.UI_OPTIONS" android:value="splitActionBarWhenNarrow" />

但是很奇怪的是我在平板上,这个显示不了,不知道什么原因

一直说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常用的就讲到这里

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值