- App Icon:可显示APP的icon,也可用其他图标代替。当软件不在最高级页面时,图标左侧会显示一个左箭头,用户可以通过这个箭头向上导航。
- 视图切换:(效果如下图)
- Action Buttons:这个放最重要的软件功能,放不下的按钮就自动进入Action overflow了。
- Action overflow:不常用的操作项目自动进入Action overflow
(二)、创建ActionBar:
1、在res目录下创建一个menu目录,在此目录下创建一个XML资源文件来定义menu。同样可以有普通菜单、二级普通菜单、二级可选项菜单。
<item
android:id="@+id/menu_about"
android:orderInCategory="2"
android:showAsAction="never" 【注意:android:showAsAction的属性值有:never、always、ifRoom、withText、collapseActionView】
android:title="关于"/>
android:showAsAction属性值的解释:
注意:使用app:showAsAction="always" 并添加 xmlns:app="http://schemas.android.com/apk/res-auto"
- never : 不将该MenuItem显示在ActionBar上(是默认值)
- always : 总是将该MenuItem显示在ActionBar上
- ifRoom : 当AcitonBar位置充裕时将该MenuItem显示在ActionBar上
- withText : 将该MenuItem显示在ActionBar上,并显示该菜单项的文本
- collapseActionView : 将该ActionView折叠成普通菜单项。最低API=14
<span style="font-size:14px;"> </span><span style="font-size:18px;"> /**
* 创建一个选择菜单,系统方法
* @param menu
* @return
*/
@Override
public boolean onCreateOptionsMenu(Menu menu) {
//1.在res中创建一个menu文件夹
//2.创建menu加载器,加载menu菜单
getMenuInflater().inflate(R.menu.actionbar,menu);
return super.onCreateOptionsMenu(menu);
}
/**
* 对menu设置监听,系统方法
* @param item
* @return
*/
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()){
case android.R.id.home: //最左边返回按键
finish();
break;
}
return super.onOptionsItemSelected(item);
}
</span>
(三)actionbar相关配置
<span style="font-size:14px;"> </span><span style="font-size:18px;"> //1.拿到actionBar对象
ActionBar actionBar = getSupportActionBar();
//2.去掉actionBar的title
actionBar.setDisplayShowTitleEnabled(false);
//设置actionBar的title
actionBar.setTitle("首页");
actionBar.setSubtitle("副标题");
//3.设置是否使用home,home指的的最左边,显示一个返回按钮
actionBar.setDisplayHomeAsUpEnabled(true);
//4.设置显示logo,不仅要设置logo图片,还有设置另外两个属性
actionBar.setLogo(android.R.drawable.star_on);
actionBar.setDisplayUseLogoEnabled(true);
actionBar.setDisplayShowHomeEnabled(true);
//4.隐藏actionBar,但并不是取消,仍然占位
//如果不想要,可以在theme中设置NoActionBar
// actionBar.hide();
//5.actionBar提供了切换fragment的MODE,1,tabs 2,list Navigation:导航
// actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);
//给actionBar的条目导航设置的适配器
NavigationAdapter adapter = new NavigationAdapter();
adapter.setmDatas(getNaviData()); //导航条目上显示的数据
//给actionBar设置条目导航的回调方法,第一个参数为适配器,第二个为导航监听
actionBar.setListNavigationCallbacks(adapter, new ActionBar.OnNavigationListener() {
@Override
public boolean onNavigationItemSelected(int itemPosition, long itemId) {
Toast.makeText(MainActivity.this,""+itemPosition,Toast.LENGTH_SHORT).show();
//fragment切换,把点击的导航条目的位置传递过去
initFragment(itemPosition);
return false;
}
});</span>
2、上面代码中用到的两个方法:
<span style="font-size:14px;"> </span><span style="font-size:18px;"> /**
* 设置导航条目上显示的内容
* @return
*/
private ArrayList<String> getNaviData() {
ArrayList<String>mDatas = new ArrayList<>();
mDatas.add("首页");
mDatas.add("最新");
mDatas.add("科技");
mDatas.add("娱乐");
return mDatas;
}
/**
* 切换fragment
* @param position
*/
public void initFragment(int position){
Fragment fragment = null;
if (position == 0){
fragment = MainFragment.newInstance();
}else if(position == 1){
fragment = NewsFragment.newInstance();
}if(fragment == null){ //后面两个没有实现,点击后不做处理
return;
}
FragmentManager supportFragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = supportFragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.fl,fragment);
fragmentTransaction.commit();
}</span>
<span style="font-size:18px;">package com.example.administrator.actionbar;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;
import java.util.ArrayList;
/**
* Created by Administrator on 2016/9/27.
*/
public class NavigationAdapter extends BaseAdapter{
private ArrayList<String>mDatas;
public void setmDatas(ArrayList<String> mDatas) {
this.mDatas = mDatas;
}
@Override
public int getCount() {
return mDatas.size();
}
@Override
public Object getItem(int position) {
return mDatas.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null){
convertView = View.inflate(parent.getContext(),R.layout.item_navigation, null);
holder = new ViewHolder();
holder.tv_navigation = (TextView) convertView.findViewById(R.id.tv_navigation);
convertView.setTag(holder);
}else {
holder = (ViewHolder) convertView.getTag();
}
String s = mDatas.get(position);
holder.tv_navigation.setText(s);
return convertView;
}
class ViewHolder{
TextView tv_navigation;
}
}
</span>
@Override
protected void onSaveInstanceState(Bundle outState) {
Log.i(TAG, "==index:" + getActionBar().getSelectedNavigationIndex());
outState.putInt("tabindex", getActionBar().getSelectedNavigationIndex());
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
getActionBar().setSelectedNavigationItem(
savedInstanceState.getInt("tabindex"));
}
(五) 创建一个自定义的操作提供器
当你想要创建一个有动态行为和在悬浮菜单中有默认图标的操作视窗时,继承ActionProvider类来定义这些行为是一个比好的的方案。创建自己的操作提供器,提供一个有组织的可重用的组件,而不是在Fragment或Activity的代码中处理各种操作项的变换和行为。
要创建自己的操作提供器,只需简单的继承ActionProvider类,并且实现合适的回调方法。你应该实现以下重要的回调方法:
ActionProvider()
这个构造器把应用程序的Context对象传递个操作提供器,你应该把它保存在一个成员变量中,以便其他的回调方法使用。
OnCreateActionView()
这是你给菜单项定义操作视窗的地方。使用从构造器中接收的Context对象,获取一个LayoutInflater对象的实例,并且用XML资源来填充操作视窗,然后注册事件监听器。如:
onPerformDefaultAction()
在选中悬浮菜单中的菜单时,系统会调用这个方法,并且操作提供器应该这对这个选中的菜单项执行默认的操作。
但是,如果你的操作提供器提供了一个子菜单,即使是悬浮菜单中一个菜单项的子菜单,那么也要通过onPrepareSubMenu()回调方法来显示子菜单。这样onPerformDefaultAction()在子菜单显示时就不会被调用。
注意:实现了onOptionsItemSelected()回调方法的Activity或Frament对象能够通过处理item-selected事件(并且返回true)来覆盖操作提供器的默认行为,这种情况下,系统不会调用onPerformDefaultAction()回调方法。