【转】ActionBar学习

关于那个问题:是关于如何生成如下图所示之ActionBar效果:

               Android之ActionBar学习 - daf - chenkechao123 的博客

       其实就在官网上就有答案,自己疏忽再加上资料繁多。寻了许久,经过指点。终于找到:

To enable split action bar, simply adduiOptions="splitActionBarWhenNarrow" to your<activity> or<application> manifestelement.(http://developer.android.com/guide/topics/ui/actionbar.html)Usingsplit action bar 标题下。

如果你想拥有上图的那种效果,Fragment(关于Fragment的内容,见上篇)在menuItem的下面显示,在manifest.xml文件里在<activity>或者<application>里加上uiOptions="splitActionBarWhenNarrow"即可。

        注:本人在4.0版本平板上不能达到此效果,在4.0手机上可以实现。在平板上,效果类似如下:Android之ActionBar学习 - daf - chenkechao123 的博客

       ,如果fragment增多,不会分裂出现上图效果,而使用下拉列表来显示Fragment。

 

      下面开始正题。

 

简介
       ActionBar是一个显示在屏幕顶部的控件,它包括了在左边显示的应用的logo图标和右边操作菜单的可见项。
      我们可以选择可见的操作菜单可见项,不可见项会以下拉列表的形式呈现出来。(见上图相机图标右侧,点击出现下拉列表,显示没有直接显示出来的操作菜单可见项)
      ActionBar为Fragment之间提供标签导航

 Android之ActionBar学习 - daf - chenkechao123 的博客

添加ActionBar
    不需要导入ActionBar,因为在android3.0或者以上版本中,ActionBar已经默认的包含在Activity中
    在Android3.0的默认主题“holographic”中,已经创造了ActionBar
    当android:minSdkVersion 或者 android:targetSdkVersion属性被设置成11或者更高时,应用会被认为是Android3.0版本(默认含有ActionBar)
去除ActionBar 
    我们可以通过把主题设置为Theme.Holo.NoActionBar为一个Activity去除掉ActionBar。                                                                                       <activityandroid:theme="@android:style/Theme.Holo.NoActionBar">
    我们也可以通过在代码中调用show()或者hide()方法来相应的显示或者隐藏ActionBar
添加Action Item
              每一个操作菜单的菜单项都可以成为ActionBar中的一个Action Item
      参考代码如下:

     ActionBarDemoActivity.java:

[java] 
public class ActionBarDemoActivity extendsActivity 

    
   @Override 
    public voidonCreate(Bundle savedInstanceState) 
   
       super.onCreate(savedInstanceState); 
       setContentView(R.layout.main); 
       Button showBt = (Button)findViewById(R.id.showBt); 
       showBt.setOnClickListener(newOnClickListener() 
       
           public void onClick(View view) 
           
               ActionBar actionBar = getActionBar(); 
               actionBar.show(); 
           
       }); 
 
   
 
    publicboolean onCreateOptionsMenu(Menu menu) 
   
       super.onCreateOptionsMenu(menu); 
       MenuItem add = menu.add(0, 1, 0,"Save"); 
       MenuItem open = menu.add(0, 2, 1,"Open"); 
       MenuItem close = menu.add(0, 3, 2,"Close"); 
       add.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); 
       open.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); 
       close.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); 
       return true; 
   


       main.xml


[html]
<?xml version="1.0"encoding="utf-8"?> 
<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android" 
   android:layout_width="fill_parent" 
   android:layout_height="fill_parent" 
   android:orientation="horizontal"> 
 
   <Button 
       android:id="@+id/hideBt" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:text="Hide The Action Bar"> 
   </Button> 
 
   <Button 
       android:id="@+id/showBt" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:text="Show The Action Bar"> 
   </Button> 
 
</LinearLayout> 

     效果图如下:

 

添加活动项(ActionItem)

 

Android之ActionBar学习 - daf - chenkechao123 的博客
 

       当使用xml文件创建菜单(menu)时,可以标记这些菜单项作为想要实现的Action Item
代码如下:
ActionBarXMLActivity:
     
[java] 
public class ActionBarXMLActivity extends Activity{ 
    
   @Override 
    public voidonCreate(Bundle savedInstanceState) { 
       super.onCreate(savedInstanceState); 
       setContentView(R.layout.main); 
   
 
   @Override 
    publicboolean onCreateOptionsMenu(Menu menu) 
   
       MenuInflater inflater =getMenuInflater(); 
       inflater.inflate(R.menu.optionsmenu,menu); 
       return true; 
   

  

optionsmenu.xml:


[html] 
<?xml version="1.0"encoding="utf-8"?> 
<menuxmlns:android="http://schemas.android.com/apk/res/android"> 
 
   <item 
       android:id="@+id/item1" 
       android:orderInCategory="1" 
       android:showAsAction="ifRoom|withText" 
       android:title="@string/save"/> 
 
   <item 
       android:id="@+id/item1" 
       android:orderInCategory="2" 
       android:showAsAction="ifRoom|withText" 
       android:title="@string/edit"/> 
 
   <item 
       android:id="@+id/item1" 
       android:orderInCategory="3" 
       android:showAsAction="ifRoom|withText" 
       android:title="@string/about"/> 
 
   <item 
       android:id="@+id/item1" 
       android:orderInCategory="4" 
       android:showAsAction="ifRoom|withText" 
       android:title="@string/help"/> 
 
</menu> 


效果图:

 Android之ActionBar学习 - daf - chenkechao123 的博客

 

菜单项过多溢出

 

 

      当创建一个ActionBar拥有太多的Actionitem以至于没有足够的控件来显示会在屏幕的右上角出现一个溢出菜单项,可以通过它来访问溢出部分菜单。
      代码示例:
      其Activity代码如上(ActionBarXMLActivity)
      溢出菜单xml
[html] 
<?xml version="1.0"encoding="utf-8"?> 
<menuxmlns:android="http://schemas.android.com/apk/res/android"> 
 
   <item 
       android:id="@+id/item1" 
       android:orderInCategory="1" 
       android:showAsAction="ifRoom|withText" 
       android:title="@string/save"/> 
</menu> 

其效果图如下:

 Android之ActionBar学习 - daf - chenkechao123 的博客

使用带字的Action Item

 

Action item 默认格式是如果菜单项含字和图标的话,只显示图标
       如果想要显示字的效果,在xml里如下设置:android:showAsAction="ifRoom|withText"
       或者在代码里调用setShowAsAction():setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM)

Action事件
       ActionBar中一个菜单项(即Actionitem)的触发像以前版本中的活动菜单回调方法(onOptionsItemSelected())一样。
       当用户选择一个Fragment的菜单项时,首先会调用Activity的onOptionsItemSelected()方法,如果该方法返回false,则调用Fragment实现的onOptionsItemSelected()方法。

应用图标

 

默认情况下,应用图标在ActionBar的左侧
   当用户点击应用bar的时候,系统会调用你的Activity里面的onOptionsItemSelected()方法里面的Android.R.id.HomeID(你的主ID)里定义的事件。我们可以重写这个方法,添加一个条件执行该行为:让它跳转到这个应用的主Activity而不是返回的主屏幕。
   如果选择返回应用的主activity,最好的方式是在创建的Intent中添加FLAG_ACTIVITY_CLEAR_TOP这个标签。
   使用这个FLAG_ACTIVITY_CLEAR_TOP标签,如果应用的主Activity已经在activity栈中存在,所有在其上的activity都会被销毁,然后主activity会到栈顶,而不用创建主Activity的的新实例。

[java] 
@Override 
    publicboolean onOptionsItemSelected(MenuItemitem) 
   
       switch (item.getItemId()) 
       
       case android.R.id.home: 
           Intent intent = new Intent(this,MainActivity.class); 
           intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
           startActivity(intent); 
           return true; 
       default: 
           returnsuper.onOptionsItemSelected(item); 
       
   

 

         当我们想实现用户点击ActionBar图标后返回前一个activity,可以通过在Actionbar设置setDisplayHomeAsUpEnabled(true)来实现。
[java] 
public class HomyUpActivity extends Activity{ 
    
   @Override 
    public voidonCreate(Bundle savedInstanceState) { 
       super.onCreate(savedInstanceState); 
       setContentView(R.layout.main); 
   
   @Override 
    protectedvoid onStart() { 
       super.onStart(); 
       ActionBar actionBar =this.getActionBar(); 
       actionBar.setDisplayHomeAsUpEnabled(true); 
   
   @Override 
    publicboolean onCreateOptionsMenu(Menu menu){ 
       MenuInflater inflater =getMenuInflater(); 
       inflater.inflate(R.menu.optionsmenu,menu); 
       return true; 
   
 

效果图:Android之ActionBar学习 - daf - chenkechao123 的博客

 

添加活动视图
       我们也可以添加一个视图作为一个ActionItem.我们可以通过在xml元素的android:actionLayout属性制定我们希望现实布局资源的ID(例如@layout/mysearchview)
       我们可以选择添加android:actionViewClass属性分配与完全限定的类名描述我们想要显示的视图(例如android.widget.SearchView)
代码示例:
optionsmenu.xml
[java]
<?xml version="1.0"encoding="utf-8"?> 
<menu xmlns:android="http://schemas.android.com/apk/res/android"> 
 
   <item 
       android:id="@+id/item4" 
       android:orderInCategory="4" 
       android:showAsAction="ifRoom|withText" 
       android:title="@string/help"/> 
   <item 
       android:id="@+id/item5" 
       android:orderInCategory="5" 
       android:showAsAction="ifRoom|withText" 
       android:title="@string/file"/> 
   <item 
       android:id="@+id/search" 
       android:actionViewClass="android.widget.SearchView" 
       android:showAsAction="ifRoom" 
       android:title="Search"/> 
 
</menu> 

HomeUpActivity.java
[java] 
public class HomyUpActivity extends Activity{ 
    
   @Override 
    public voidonCreate(Bundle savedInstanceState) { 
       super.onCreate(savedInstanceState); 
       setContentView(R.layout.main); 
   
   @Override 
    protectedvoid onStart() { 
       super.onStart(); 
       ActionBar actionBar =this.getActionBar(); 
       actionBar.setDisplayHomeAsUpEnabled(true); 
   
 
   @Override 
    publicboolean onCreateOptionsMenu(Menu menu) 
   
       MenuInflater inflater =getMenuInflater(); 
       inflater.inflate(R.menu.optionsmenu,menu); 
       return true; 
   

效果图:

 Android之ActionBar学习 - daf - chenkechao123 的博客

ActionBar 标签

 

ActionBar可以现实选项卡供用户切换浏览该Activity中不同的Fragment
       每个标签都可以是一个图标或文本标题

代码示例:
      TabsActivity.java
[java]
public class TabsActivity extendsActivity 

    
   @Override 
    public voidonCreate(Bundle savedInstanceState) 
   
       super.onCreate(savedInstanceState); 
       setContentView(R.layout.main); 
       ActionBar bar = getActionBar(); 
       bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); 
       ActionBar.Tab tabA = bar.newTab().setText("ATab"); 
       ActionBar.Tab tabB = bar.newTab().setText("BTab"); 
       ActionBar.Tab tabC = bar.newTab().setText("CTab"); 
       Fragment fragmentA = newAFragmentTab(); 
       Fragment fragmentB = newBFragmentTab(); 
       Fragment fragmentC = newCFragmentTab(); 
 
   
   tabA.setTabListener(newMyTabsListener(fragmentA)); 
   tabB.setTabListener(newMyTabsListener(fragmentB)); 
   tabC.setTabListener(newMyTabsListener(fragmentC)); 
   bar.addTab(tabA); 
   bar.addTab(tabB); 
   bar.addTab(tabC); 
    protectedclass MyTabsListener implementsActionBar.TabListener 
   
       private Fragment fragment; 
       public MyTabsListener(Fragmentfragment) 
       
           this.fragment = fragment; 
       
       @Override 
       public void onTabSelected(Tab tab, FragmentTransactionft) 
       
           ft.add(R.id.fragment_place, fragment,null); 
       
   
     

AFragmentTab.java
[java] 
public class AFragmentTab extendsFragment 

   @Override 
    public ViewonCreateView(LayoutInflater inflater, ViewGroupcontainer, 
           Bundle savedInstanceState) 
   
       return inflater.inflate(R.layout.fragment_a, container,false); 
   

BFragmentTab.java
[java] 
public class BFragmentTab extendsFragment 

   @Override 
    public ViewonCreateView(LayoutInflater inflater, ViewGroupcontainer, 
           Bundle savedInstanceState) 
   
       return inflater.inflate(R.layout.fragment_b, container,false); 
   

CFragmentTab.java
[java]
public class CFragmentTab extendsFragment 

   @Override 
    public ViewonCreateView(LayoutInflater inflater, ViewGroupcontainer, 
           Bundle savedInstanceState) 
   
       return inflater.inflate(R.layout.fragment_c, container,false); 
   

main.xml
[html] 
<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android" 
   android:layout_width="fill_parent" 
   android:layout_height="fill_parent" 
   android:orientation="vertical"> www.2cto.com
 
   <LinearLayout 
       android:id="@+id/fragment_place" 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content"> 
   </LinearLayout> 
 
</LinearLayout> 

效果图:Android之ActionBar学习 - daf - chenkechao123 的博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值