最近在学习7710源码的deskclock时,遇到了ActionBar这个活动栏,所以上网查了些资料。自己也写了下demo,不是在平板模拟器上运行的。
ActionBar 替代了显示在屏幕顶端的标题栏,主要负责显示菜单,widget,导航等功能
主要功能包括:
--显示选项菜单中的菜单项到活动栏
--添加可交互的视图到活动栏作为活动视图
--使用应用的图标作为活动项,代表返回home或者向上等重要操作
--提供标答导航,方便不同的fragment这间切换,提供下拉导航功能
只不过此功能要在3.0以上才能用。也就是说要将你的manifast.xml中的minSdkVersion和targetSdkVersion设置成大于11的才可以。
此功能的属性可以在xml文件中配置也可用代表设置:
在xml文件中:android:showAsAction="always|withText"
在代表中:setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
其属性分别表示的意思:
1、always:这个值会使菜单项一直显示在Action Bar上。
2、ifRoom:如果有足够的空间,这个值会使菜单项显示在Action Bar上。
3、never:这个值使菜单项永远都不出现在Action Bar上, 但是该菜单项会出现在平常的菜单中
4、withText:这个值使菜单项和它的图标,菜单文本一起显示。
下面看看我参照网上写的一个demo:
MainActivity.java
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
final ActionBar ab = getActionBar();
Button showBt = (Button) findViewById(R.id.showBt);
showBt.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
ab.show();
}
});
Button hideBt = (Button) findViewById(R.id.hideBt);
hideBt.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
ab.hide();
}
});
}
@Override
protected void onStart() {
// TODO Auto-generated method stub
super.onStart();
ActionBar ab = this.getActionBar();
ab.setDisplayHomeAsUpEnabled(true);
}
@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);
super.onCreateOptionsMenu(menu);
MenuItem add = menu.add(0, 1, 0, "Save");
MenuItem open = menu.add(0, 2, 0, "Open");
MenuItem close = menu.add(0, 3, 0, "close");
add.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
open.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
close.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// TODO Auto-generated method stub
switch(item.getItemId()){
case R.id.home:
Intent intent = new Intent(this,MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
return true;
case R.id.tabs:
Intent tab = new Intent(this,TabsActivity.class);
startActivity(tab);
default:
return super.onOptionsItemSelected(item);
}
}
}
main.xml
上个图片看看:
点击hide可以将此actionbar隐藏
点击show可以下拉此actionbar.就像第一张图片一样。
对于添加的选项,也可以通过menu.xml来添加:
修改MainActivity.java如下:
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
final ActionBar ab = getActionBar();
Button showBt = (Button) findViewById(R.id.showBt);
showBt.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
ab.show();
}
});
Button hideBt = (Button) findViewById(R.id.hideBt);
hideBt.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
ab.hide();
}
});
}
@Override
protected void onStart() {
// TODO Auto-generated method stub
super.onStart();
ActionBar ab = this.getActionBar();
ab.setDisplayHomeAsUpEnabled(true);
}
@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);
super.onCreateOptionsMenu(menu);
// MenuItem add = menu.add(0, 1, 0, "Save");
// MenuItem open = menu.add(0, 2, 0, "Open");
// MenuItem close = menu.add(0, 3, 0, "close");
// add.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
// open.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
// close.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// TODO Auto-generated method stub
switch(item.getItemId()){
case R.id.home:
Intent intent = new Intent(this,MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
return true;
case R.id.tabs:
Intent tab = new Intent(this,TabsActivity.class);
startActivity(tab);
default:
return super.onOptionsItemSelected(item);
}
}
}
在res/menu下添加main.xml文件:
运行如下图:
若在此基础上多添加一些item,当创建一个ActionBar拥有太多的Action item以至于没有足够的控件来显示会在屏幕的右上角出现一个溢出菜单项,可以通过它来访问溢出部分菜单,这个我没运行成功,可能是由于android模拟器大小局限吧。
要修改的话,只需将上面那些注释掉的item打开即可。
添加单击事件:
ActionBar中一个菜单项(即Action item)的触发像以前版本中的活动菜单回调方法(onOptionsItemSelected())一样。
当用户选择一个Fragment的菜单项时,首先会调用Activity的onOptionsItemSelected()方法,如果该方法返回false,则调用Fragment实现的onOptionsItemSelected()方法。
代码就是上面MainActivity.java中的
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// TODO Auto-generated method stub
switch(item.getItemId()){
case R.id.home:
Intent intent = new Intent(this,MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
return true;
case R.id.tabs:
Intent tab = new Intent(this,TabsActivity.class);
startActivity(tab);
default:
return super.onOptionsItemSelected(item);
}
}
当我们想实现用户点击ActionBar 图标后返回前一个activity,可以通过在Actionbar设置setDisplayHomeAsUpEnabled(true) 来实现
@Override
protected void onStart() {
// TODO Auto-generated method stub
super.onStart();
ActionBar ab = this.getActionBar();
ab.setDisplayHomeAsUpEnabled(true);
}
添加活动视图
我们也可以添加一个视图作为一个Action Item.我们可以通过在xml元素的android:actionLayout属性制定我们希望现实布局资源的ID(例如@layout/mysearchview)
我们可以选择添加android:actionViewClass属性分配与完全限定的类名描述我们想要显示的视图(例如android.widget.SearchView)
ActionBar 标签
ActionBar可以现实选项卡供用户切换浏览该Activity中不同的Fragment
每个标签都可以是一个图标或文本标题
TabsActivity.java
public class TabsActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.tabs);
ActionBar ab = getActionBar();
ab.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
ActionBar.Tab tabA = ab.newTab().setText("A Tab");
ActionBar.Tab tabB = ab.newTab().setText("B Tab");
ActionBar.Tab tabC = ab.newTab().setText("C Tab");
Fragment fA = new AFragmentTab();
Fragment fB = new BFragmentTab();
Fragment fC = new CFragmentTab();
tabA.setTabListener(new MyTabsListener(fA));
tabB.setTabListener(new MyTabsListener(fB));
tabC.setTabListener(new MyTabsListener(fC));
ab.addTab(tabA);
ab.addTab(tabB);
ab.addTab(tabC);
}
protected class MyTabsListener implements ActionBar.TabListener{
private Fragment fm;
public MyTabsListener(Fragment fm){
this.fm = fm;
}
@Override
public void onTabReselected(Tab tab, FragmentTransaction ft) {
// TODO Auto-generated method stub
//ft.add(R.id.fragment_place, fm,null);
}
@Override
public void onTabSelected(Tab tab, FragmentTransaction ft) {
// TODO Auto-generated method stub
ft.add(R.id.fragment_place, fm,null);
}
@Override
public void onTabUnselected(Tab tab, FragmentTransaction ft) {
// TODO Auto-generated method stub
}
}
}
tabs.xml
AFragmentTab.java
public class AFragmentTab extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// TODO Auto-generated method stub
return inflater.inflate(R.layout.fragment_a, container,false);
}
}
fragment_a.xml
b和c跟a类似。
但是我在运行这一步时,点击B TAB 后,仍然显示this is a fragment 。我还以找原因,也请高手帮我看看。谢谢!
需要源码的可以留言!