android ActionBar详解

来源:互联网 发布:js运行环境 编辑:程序博客网 时间:2024/05/20 18:49

1:ActionBar介绍

ActionBar和Fragement都是android3.0以后出的新特性。ActionBar有点像Windows下面的工具栏,可以放置各种控件。在ADT创建工程的时候里面有两个文件夹values-v11和values-v14这两个文件里面定义就是android3.x和4.x的两种不同ActionBar风格。

2:ActionBar实例介绍

2.1:ActionBar使用简介

当我们创建工程的时候会在menu文件夹下面生成一个main.xml的文件夹,打开这个xml里面的有个属性是我们ActionBar的主要的属性,
   <item        android:id="@+id/action_settings"        android:orderInCategory="100"        android:showAsAction="always"        android:icon="@drawable/ic_launcher"        android:title="@string/action_settings"/>
这里有个showAsAction="always"这个属性就是我们ActionBar的主要属性,它规定了我们的item显示的方式,默认创建的时候它的值是never,这个属性有五个值。
1.ifRoom  ----------只有在ActionBar有空间的时候才会显示
2:withText -------------显示文字,一般与ifRoom一起使用。
3: never ---------不显示在ActionBar上面
4:always---------总是放在actionbar上面但是如果实在放不下去还是不会放
5:coolapseActionVIew-----允许与Action按钮关联的Action视图可折叠
下面我们来看一个例子
这里给出我们的xml文件
<menu xmlns:android="http://schemas.android.com/apk/res/android" >    <item        android:id="@+id/action_settings"        android:orderInCategory="100"        android:showAsAction="never"        android:icon="@drawable/ic_launcher"        android:title="@string/action_settings"/>       <item        android:id="@+id/action_test_one"        android:orderInCategory="100"        android:showAsAction="ifRoom"        android:icon="@drawable/ic_launcher"        android:title="@string/action_settings"/>          <item        android:id="@+id/action_test_two"        android:orderInCategory="100"        android:showAsAction="always"        android:icon="@drawable/ic_launcher"        android:title="@string/action_settings"/></menu>
然后看看我们的java代码
public class MainActivity extends Activity {@TargetApi(Build.VERSION_CODES.HONEYCOMB)@SuppressLint("NewApi")@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//这一句的意思是隐藏ActionBar()效果跟requestWindowFeature(Window.FEATURE_NO_TITLE);//差不多//getActionBar().hide();}//这里加载菜单也就是加载ActionBar@Overridepublic boolean onCreateOptionsMenu(Menu menu) {// Inflate the menu; this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.main, menu);return true;}//处理ActionBar的点击事件@Overridepublic boolean onOptionsItemSelected(MenuItem item) {// TODO Auto-generated method stubToast.makeText(MainActivity.this, "actionbar test", Toast.LENGTH_SHORT).show();return super.onOptionsItemSelected(item);}}

如果想要把ActionBar放在底部就需要在Activity里面添加一个属性
 <activity            android:name="com.example.actionbardemo.MainActivity"            android:uiOptions="splitActionBarWhenNarrow"            android:label="@string/app_name" />

这样ActionBar就会在底部了但是这个属性是4.0以后才开始支持的。

2:收缩和展开ActionBar

在item标签下面还有两个属性   android:actionViewClass=""
        android:actionLayout=""
这两个属性就会直接替换控件的视图。随意指定一个但是如果两个都指定了Class这个属性会高于Layout这个属性。
如果需要在展开的时候进行一些操作就需要实现
OnActionExpandListener这个接口里面有两个函数@Override
public boolean onMenuItemActionCollapse(MenuItem item) {
// TODO Auto-generated method stub
return false;
}


@Override
public boolean onMenuItemActionExpand(MenuItem item) {
// TODO Auto-generated method stub
return false;
}
看代码就知道是干什么了的,然后就是展开和收起操作
item.expandActionView();//展开
item.collapseActionView();//收起

3:ActionProvider

我们要实现的样子就是分享功能

还是先看我们的xml的代码。
<menu xmlns:android="http://schemas.android.com/apk/res/android" >    <item        android:id="@+id/Share"        android:orderInCategory="100"        android:showAsAction="ifRoom"        android:actionProviderClass="android.widget.ShareActionProvider"        android:title="分享"/>       <item        android:id="@+id/action_test_one"        android:orderInCategory="100"        android:showAsAction="ifRoom"        android:icon="@drawable/ic_launcher"        android:title="@string/action_settings"/>          <item        android:id="@+id/action_test_two"        android:orderInCategory="100"        android:showAsAction="always"        android:icon="@drawable/ic_launcher"        android:title="@string/action_settings"/></menu>
然后我们在看看java的实现代码最主要的就是onCreateOptionsMenu其它都一样这里我贴出来。
//这里加载菜单也就是加载ActionBar@SuppressLint("NewApi")@Overridepublic boolean onCreateOptionsMenu(Menu menu) {// Inflate the menu; this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.main, menu);MenuItem item = menu.findItem(R.id.Share);//获取对象ShareActionProvider actionProvider = (ShareActionProvider)item.getActionProvider();Intent intent = new Intent(Intent.ACTION_SEND);//在分享的时候值显示可以接收文本的程序intent.setType("text/plain");//设置要分享的数据intent.putExtra(Intent.EXTRA_SUBJECT, "分享");intent.putExtra(Intent.EXTRA_TEXT, "使用ShareActionProvider");actionProvider.setShareIntent(intent);//设置一个分享历史避免一个程序中多个分享历史的程序//actionProvider.setShareHistoryFileName("share.xml");return true;}
同时也可以自己定义ActionProvider。有兴趣的可以自己研究一下。

4:导航标签

我们用actionbar替换tabhost,因为actionbar比它更强大,更灵活。一般使用ActionBar的为导航的具体步骤如下。
1:首先设置ActionBar为导航标签模式
getActionBar().setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
2:实现ActionBar.TabLisenler接口
3:创建标签对象
4:添加标签
5:保存和恢复状态

这里看看代码,xml没有改动过,直接上java代码
public class MainActivity extends Activity implements TabListener {@TargetApi(Build.VERSION_CODES.HONEYCOMB)@SuppressLint("NewApi")@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//这一句的意思是隐藏ActionBar()效果跟requestWindowFeature(Window.FEATURE_NO_TITLE);//差不多//getActionBar().hide();ActionBar actionBar = getActionBar();actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);actionBar.addTab(actionBar.newTab().setText("tab1").setTabListener(this));actionBar.addTab(actionBar.newTab().setText("tab2").setTabListener(this));actionBar.addTab(actionBar.newTab().setText("tab3").setTabListener(this));}//这里加载菜单也就是加载ActionBar@SuppressLint("NewApi")@Overridepublic boolean onCreateOptionsMenu(Menu menu) {// Inflate the menu; this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.main, menu);MenuItem item = menu.findItem(R.id.Share);//获取对象ShareActionProvider actionProvider = (ShareActionProvider)item.getActionProvider();Intent intent = new Intent(Intent.ACTION_SEND);//在分享的时候值显示可以接收文本的程序intent.setType("text/plain");//设置要分享的数据intent.putExtra(Intent.EXTRA_SUBJECT, "分享");intent.putExtra(Intent.EXTRA_TEXT, "使用ShareActionProvider");actionProvider.setShareIntent(intent);//设置一个分享历史避免一个程序中多个分享历史的程序//actionProvider.setShareHistoryFileName("share.xml");return true;}//处理ActionBar的点击事件@Overridepublic boolean onOptionsItemSelected(MenuItem item) {// TODO Auto-generated method stubToast.makeText(MainActivity.this, "actionbar test", Toast.LENGTH_SHORT).show();return super.onOptionsItemSelected(item);}/** * 这个是tab的放开调用的方法 */@Overridepublic void onTabReselected(Tab arg0, FragmentTransaction arg1) {// TODO Auto-generated method stub}/** * 这个是tab的选中调用的方法 */@Overridepublic void onTabSelected(Tab arg0, FragmentTransaction arg1) {// TODO Auto-generated method stub}/** * 这个是tab的为选中调用的方法 */@Overridepublic void onTabUnselected(Tab arg0, FragmentTransaction arg1) {// TODO Auto-generated method stub}}

5:下拉导航列表

实现导航栏下来要实现这几个步骤
1:设置ActionBar的导航模式为下拉列表
2:实现ActionBar.OnNavigationListener接口中的方法
3:创建Adapter
4:绑定adapter
5:数据的保存和恢复

我们来看代码,直接上java的xml的一点没变
public class MainActivity extends Activity implements OnNavigationListener {@TargetApi(Build.VERSION_CODES.HONEYCOMB)@SuppressLint("NewApi")@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//这一句的意思是隐藏ActionBar()效果跟requestWindowFeature(Window.FEATURE_NO_TITLE);//差不多//getActionBar().hide();ActionBar actionBar = getActionBar();actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);actionBar.setListNavigationCallbacks(new ArrayAdapter<String>(actionBar.getThemedContext(),android.R.layout.simple_list_item_1, android.R.id.text1, new String[] { "条目1", "条目2", "条目3" }), this);}//这里加载菜单也就是加载ActionBar@SuppressLint("NewApi")@Overridepublic boolean onCreateOptionsMenu(Menu menu) {// Inflate the menu; this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.main, menu);MenuItem item = menu.findItem(R.id.Share);//获取对象ShareActionProvider actionProvider = (ShareActionProvider) item.getActionProvider();Intent intent = new Intent(Intent.ACTION_SEND);//在分享的时候值显示可以接收文本的程序intent.setType("text/plain");//设置要分享的数据intent.putExtra(Intent.EXTRA_SUBJECT, "分享");intent.putExtra(Intent.EXTRA_TEXT, "使用ShareActionProvider");actionProvider.setShareIntent(intent);//设置一个分享历史避免一个程序中多个分享历史的程序//actionProvider.setShareHistoryFileName("share.xml");return true;}//处理ActionBar的点击事件@Overridepublic boolean onOptionsItemSelected(MenuItem item) {// TODO Auto-generated method stubToast.makeText(MainActivity.this, "actionbar test", Toast.LENGTH_SHORT).show();return super.onOptionsItemSelected(item);}/** * 点击条目的时候调用的方法 */@Overridepublic boolean onNavigationItemSelected(int itemPosition, long itemId) {// TODO Auto-generated method stubreturn false;}}


0 0
原创粉丝点击