android ActionBar详解

42 篇文章 0 订阅

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")
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		//这一句的意思是隐藏ActionBar()效果跟requestWindowFeature(Window.FEATURE_NO_TITLE);
		//差不多
		//getActionBar().hide();
	}

	//这里加载菜单也就是加载ActionBar
	@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);
		return true;
	}
	//处理ActionBar的点击事件
	@Override
	public boolean onOptionsItemSelected(MenuItem item) {
		// TODO Auto-generated method stub
		Toast.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")
	@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);
		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")
	@Override
	protected 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")
	@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);
		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的点击事件
	@Override
	public boolean onOptionsItemSelected(MenuItem item) {
		// TODO Auto-generated method stub
		Toast.makeText(MainActivity.this, "actionbar test", Toast.LENGTH_SHORT).show();

		return super.onOptionsItemSelected(item);
	}

	/**
	 * 这个是tab的放开调用的方法
	 */
	@Override
	public void onTabReselected(Tab arg0, FragmentTransaction arg1) {
		// TODO Auto-generated method stub
		
	}
	/**
	 * 这个是tab的选中调用的方法
	 */
	@Override
	public void onTabSelected(Tab arg0, FragmentTransaction arg1) {
		// TODO Auto-generated method stub
		
	}
	/**
	 * 这个是tab的为选中调用的方法
	 */
	@Override
	public 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")
	@Override
	protected 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")
	@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);
		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的点击事件
	@Override
	public boolean onOptionsItemSelected(MenuItem item) {
		// TODO Auto-generated method stub
		Toast.makeText(MainActivity.this, "actionbar test", Toast.LENGTH_SHORT).show();
		return super.onOptionsItemSelected(item);
	}

	/**
	 * 点击条目的时候调用的方法
	 */
	@Override
	public boolean onNavigationItemSelected(int itemPosition, long itemId) {
		// TODO Auto-generated method stub
		
		return false;
	}

}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值