尊重原创:http://blog.csdn.net/yuanzeyao/article/details/39378825
关于ActionBar,相信大家并不陌生,但是真正能够熟练使用的也不是很多,这篇文章主要为大家详细介绍ActionBar的相关知识,ActionBar是在Android3.0中引入的概念,所以在2.x系统中使用ActionBar我们需要依赖ActionBarSherklock或者androi-support-v7库,ActionBarSherklock是anroid中非常有名的一个开源项目,android-support-v7是Google后来推出的一个库,有了v7库后AndroidBarSherklock这个开源项目基本可以退出历史舞台了,在使用android-support-v7的过程中,一定不能仅仅使用它的jar包,因为它的jar包不包含一些重要的资源文件,我们必须导入android-support-v7工程,然后让我们的工程依赖它。
ActionBar的作用
1、帮助用户知道你现在处于哪个页面
2、为用户提供统一的导航界面
关于更多的ActionBar导航功能请参见 http://developer.android.com/guide/topics/ui/actionbar.html 我的这篇文章基本也是参考这里的
ActionBar在界面中的展现形式 如下图:
从图中可以看到一个ActionBar包括 APP icon,ActionItems,Action Overflow,其实ActionBar基本就代替了以前版本中的菜单的概念,在不支持ActionBar的App中,如果你创建了菜单,当你点击菜单键时,下方会出来菜单,而在支持Actionbar的菜单中这些菜单向就出现在了ActionItem和Action Overflow里面了(详细请见后面),有些细心同学在平时可能会发现同一款App,在有些手机上出现了Overflow,而有些手机却没有,其实这个是有规律的,在有菜单物理键的手机上是没有Overflow的,在没有物理菜单的手机上才有,其实Google一直主张Android设备去掉物理菜单键,所以相信以后大部分手机都没有菜单物理键的,所以菜单的概念也会慢慢的淡化。
下面我们开始学习ActionBar吧 ,由于3.0之后的系统和2.x系统还是有稍微的区别,所以我今天打算先讲讲2.x系统中ActionBar的使用,然后讲解3.0之后系统ActionBar的使用。
这里我们就使用android-support-v7吧,毕竟它是Google推出来的。
1、导入android-support-v7库,这个库其实在你的sdk里面就有(前提是你已经下载下来了),如我的路径:D:\android-sdk-windows\extras\android\support\v7\appcompat
2、创建项目,让我们的库依赖andorid-support-v7,并让需要使用ActionBar的Activity依赖ActionBarActivity,并进行如下配置:
ActionBar actionBar = getSupportActionBar();
actionBar.hide();
@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);
//返回true才会显示overflow按钮
return true;
}
第二个问题就是设置了icon为什么没有显示?其实在Actionbar中,处于ActionItem位置的item默认是显示icon而不显示title的,我们可以通过在showAsActoin中配置"always|withText",让Tiele显示出来(但是也不一定会显示,只是尽量显示),而处于Overflow的item 默认是显示title而不显示icon的,这个可以通过反射机制来改变,方案如下:
public void setOverflowIconVisiable(Menu menu)
{
try
{
Class clazz=Class.forName("com.android.internal.view.menu.MenuBuilder");
Field field=clazz.getDeclaredField("mOptionalIconsVisible");
if(field!=null)
{
field.setAccessible(true);
field.set(menu , true);
}
} catch (ClassNotFoundException e)
{
e.printStackTrace();
} catch (NoSuchFieldException e)
{
e.printStackTrace();
} catch (IllegalArgumentException e)
{
e.printStackTrace();
} catch (IllegalAccessException e)
{
e.printStackTrace();
}
}
然后再onMenuOpened方法中调用
@Override
public boolean onMenuOpened(int featureId, Menu menu)
{
if(featureId == Window.FEATURE_ACTION_BAR && menu != null)
{
setOverflowIconVisiable(menu);
}
return super.onMenuOpened(featureId, menu);
}
目前这些ActionItem和Overflowsitems都是没有响应事件的,现在为他们添加吧,如果以前使用过菜单的同学会觉得和菜单是一样的
@Override
public boolean onOptionsItemSelected(MenuItem item)
{
switch(item.getItemId())
{
case R.id.action_copy:
Toast.makeText(this, item.getTitle(), 1000).show();
return true;
case R.id.action_cut:
Toast.makeText(this, item.getTitle(), 1000).show();
return true;
case R.id.action_delete:
Toast.makeText(this, item.getTitle(), 1000).show();
return true;
case R.id.action_edit:
Toast.makeText(this, item.getTitle(), 1000).show();
return true;
case R.id.action_email:
Toast.makeText(this, item.getTitle(), 1000).show();
return true;
}
return super.onOptionsItemSelected(item);
}
public class MyFragment extends Fragment
{
private static final String TAG = "MyFragment";
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
//一定要调用,否则无法将菜单加入ActionItem
setHasOptionsMenu(true);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
TextView tv=new TextView(this.getActivity());
tv.setText("Hello Gavin");
return tv;
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater)
{
inflater.inflate(R.menu.fragment_men, menu);
super.onCreateOptionsMenu(menu, inflater);
}
@Override
public boolean onOptionsItemSelected(MenuItem item)
{
switch(item.getItemId())
{
case R.id.action_share:
Toast.makeText(this.getActivity(), item.getTitle(), 1000).show();
return true;
}
return super.onOptionsItemSelected(item);
}
}
并重写SecondActivity的 onOptionsItemSelected方法
@Override
public boolean onOptionsItemSelected(MenuItem item)
{
switch(item.getItemId())
{
case android.R.id.home:
Intent upIntent = NavUtils.getParentActivityIntent(this);
if (NavUtils.shouldUpRecreateTask(this, upIntent)) {
TaskStackBuilder.create(this)
.addNextIntentWithParentStack(upIntent)
.startActivities();
} else {
upIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
NavUtils.navigateUpTo(this, upIntent);
}
return true;
}
return super.onOptionsItemSelected(item);
}
@Override
public Intent getSupportParentActivityIntent()
{
if(from==1)
{
return new Intent().setClassName(this.getPackageName(), "com.action.demo.ThreeActivity");
}else if(from==2)
{
return new Intent().setClassName(this.getPackageName(), "com.action.demo.ThreeActivity");
}
return super.getSupportParentActivityIntent();
}
MenuItem searchItem=menu.findItem(R.id.action_search);
final SearchView searchView=(SearchView) MenuItemCompat.getActionView(searchItem);
searchView.setOnQueryTextListener(new OnQueryTextListener()
{
@Override
public boolean onQueryTextSubmit(String arg0)
{
Toast.makeText(MainActivity.this, arg0, 1000).show();
searchView.onActionViewCollapsed();
return true;
}
@Override
public boolean onQueryTextChange(String arg0)
{
return false;
}
});
ShareActionProvider mShareActionProvider = (ShareActionProvider)
MenuItemCompat.getActionProvider(menu.findItem(R.id.action_share1));
mShareActionProvider.setShareIntent(getDefaultIntent());
运行效果如下图:
public class CustomActionProvider extends ActionProvider
{
private static final String TAG = "CustomActionProvider";
public CustomActionProvider(Context context)
{
super(context);
}
@Override
public View onCreateActionView()
{
return null;//LayoutInflater.from(getContext()).inflate(R.layout.provider_layout, null);
}
//这个方法是点击“+”号会默认执行的地方,注意这个方法可以被onOptionsItemSelected方法拦截掉
@Override
public boolean onPerformDefaultAction()
{
Toast.makeText(this.getContext(), "onPerformDefaultAction", 1000).show();
return super.onPerformDefaultAction();
}
@Override
public void onPrepareSubMenu(SubMenu subMenu)
{
super.onPrepareSubMenu(subMenu);
subMenu.clear();
subMenu.add("发起群聊").setIcon(R.drawable.alluser).setOnMenuItemClickListener(new OnMenuItemClickListener()
{
@Override
public boolean onMenuItemClick(MenuItem item)
{
return true;
}
});
}
//一定要重写该方法,并返回true,否则不会出现子菜单
@Override
public boolean hasSubMenu()
{
return true;
}
}
ActionBar bar=this.getSupportActionBar();
bar.setDisplayHomeAsUpEnabled(true);
bar.setDisplayShowTitleEnabled(false);
bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
bar.addTab(bar.newTab().setText("电影").setTabListener(this));
bar.addTab(bar.newTab().setText("电视剧").setTabListener(this));
bar.addTab(bar.newTab().setText("直播").setTabListener(this));
细心的同学会发现这里每个属性声明了两遍(个别只有一个),这是因为我们使用的是support-library-v7库,带前缀“android:”的是对应Android系统的,没有这个前缀的是support-librayr的。
最后给出tab_indicator的定义,这个是tab指示器的背景图片,这个并不是我手动写的,我是利用上面给出的网址生成的。