android actionBar学习交流


最近在学习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


	
    

上个图片看看:

android actionBar学习交流_第1张图片

点击hide可以将此actionbar隐藏

android actionBar学习交流_第2张图片

点击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文件:

 



    
    
    
    
    
    
    
    
    
    





    





    





    





    





    





    





    





    





    





    







运行如下图:



android actionBar学习交流_第3张图片

 

若在此基础上多添加一些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)


 


    
    

 

android actionBar学习交流_第4张图片

 

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类似。

android actionBar学习交流_第5张图片

 

但是我在运行这一步时,点击B TAB 后,仍然显示this is a fragment 。我还以找原因,也请高手帮我看看。谢谢!

需要源码的可以留言!


 

 

 

 

 

      

你可能感兴趣的:(移动,开发)