Android之ActionBar學習

關於那個問題:是關於如何生成以下圖所示之ActionBar效果:html

               

        其實就在官網上就有答案,本身疏忽再加上資料繁多。尋了許久,通過指點。終於找到:java

To enable split action bar, simply add uiOptions="splitActionBarWhenNarrow" to your <activity> or <application> manifest element.(http://developer.android.com/guide/topics/ui/actionbar.html)Using split action bar 標題下。android

若是你想擁有上圖的那種效果,Fragment(關於Fragment的內容,見上篇)在menuItem的下面顯示,在manifest.xml文件裏在<activity>或者<application>里加上uiOptions="splitActionBarWhenNarrow" 便可。app

         注:本人在4.0版本平板上不能達到此效果,在4.0手機上能夠實現。在平板上,效果相似以下:ide

        ,若是fragment增多,不會分裂出現上圖效果,而使用下拉列表來顯示Fragment。佈局

 

       下面開始正題。ui

簡介
        ActionBar是一個顯示在屏幕頂部的控件,它包括了在左邊顯示的應用的logo圖標和右邊操做菜單的可見項。
       咱們能夠選擇可見的操做菜單可見項,不可見項會如下拉列表的形式呈現出來。(見上圖相機圖標右側,點擊出現下拉列 表,顯示沒有直接顯示出來的操做菜單可見項)
       ActionBar爲Fragment之間提供標籤導航this

 

添加ActionBar
     不須要導入ActionBar,由於在android3.0或者以上版本中,ActionBar已經默認的包含在Activity中
     在Android3.0的默認主題「holographic」中,已經創造了ActionBar
     當android:minSdkVersion 或者 android:targetSdkVersion 屬性被設置成11或者更高時,應用會被認爲是Android3.0版本(默認含有ActionBar)
去除ActionBar 
     咱們能夠經過把主題設置爲Theme.Holo.NoActionBar爲一個Activity去除掉ActionBar。                                                                                        <activity android:theme="@android :style/Theme.Holo.NoActionBar">
     咱們也能夠經過在代碼中調用show()或者hide()方法來相應的顯示或者隱藏ActionBar
添加Action Item
               每個操做菜單的菜單項均可以成爲ActionBar中的一個Action Item
       參考代碼以下:.net

      ActionBarDemoActivity.java:xml

[java] 
public class ActionBarDemoActivity extends Activity 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.main); 
        Button showBt = (Button) findViewById(R.id.showBt); 
        showBt.setOnClickListener(new OnClickListener() 
        { 
            public void onClick(View view) 
            { 
                ActionBar actionBar = getActionBar(); 
                actionBar.show(); 
            } 
        }); 
 
    } 
 
    public boolean 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"?> 
<LinearLayout xmlns: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> 

      效果圖以下:


 

添加活動項(Action Item)
        當使用xml文件建立菜單(menu)時,能夠標記這些菜單項做爲想要實現的Action Item
代碼以下:
ActionBarXMLActivity:
     
[java] 
public class ActionBarXMLActivity extends Activity { 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.main); 
    } 
 
    @Override 
    public boolean onCreateOptionsMenu(Menu menu) 
    { 
        MenuInflater inflater = getMenuInflater(); 
        inflater.inflate(R.menu.optionsmenu, menu); 
        return true; 
    } 

  

optionsmenu.xml:


[html] 
<?xml version="1.0" encoding="utf-8"?> 
<menu xmlns: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> 


效果圖:

 

 

菜單項過多溢出
       當建立一個ActionBar擁有太多的Action item以致於沒有足夠的控件來顯示會在屏幕的右上角出現一個溢出菜單項,能夠經過它來訪問溢出部分菜單。
       代碼示例:
       其Activity代碼如上(ActionBarXMLActivity)
       溢出菜單xml
[html] 
<?xml version="1.0" encoding="utf-8"?> 
<menu xmlns: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/item2" 
        android:orderInCategory="2" 
        android:showAsAction="ifRoom|withText" 
        android:title="@string/edit"/> 
    <item 
        android:id="@+id/item3" 
        android:orderInCategory="3" 
        android:showAsAction="ifRoom|withText" 
        android:title="@string/about"/> 
    <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/item6" 
        android:orderInCategory="6" 
        android:showAsAction="ifRoom|withText" 
        android:title="@string/run"/> 
    <item 
        android:id="@+id/item7" 
        android:orderInCategory="7" 
        android:showAsAction="ifRoom|withText" 
        android:title="@string/source"/> 
    <item 
        android:id="@+id/item8" 
        android:orderInCategory="8" 
        android:showAsAction="ifRoom|withText" 
        android:title="@string/navigate"/> 
    <item 
        android:id="@+id/item9" 
        android:orderInCategory="9" 
        android:showAsAction="ifRoom|withText" 
        android:title="@string/search"/> 
    <item 
        android:id="@+id/item10" 
        android:orderInCategory="10" 
        android:showAsAction="ifRoom|withText" 
        android:title="@string/project"/> 
    <item 
        android:id="@+id/item11" 
        android:orderInCategory="11" 
        android:showAsAction="ifRoom|withText" 
        android:title="@string/refactor"/> 
    <item 
        android:id="@+id/item12" 
        android:orderInCategory="12" 
        android:showAsAction="ifRoom|withText" 
        android:title="@string/window"/> 
    <item 
        android:id="@+id/item13" 
        android:orderInCategory="13" 
        android:showAsAction="ifRoom|withText" 
        android:title="@string/help"/> 
 
</menu> 

其效果圖以下:

 

使用帶字的Action Item
        Action item 默認格式是若是菜單項含字和圖標的話,只顯示圖標
        若是想要顯示字的效果,在xml裏以下設置:android:showAsAction="ifRoom|withText"
        或者在代碼裏調用setShowAsAction():setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM)

Action事件
        ActionBar中一個菜單項(即Action item)的觸發像之前版本中的活動菜單回調方法(onOptionsItemSelected())同樣。
        當用戶選擇一個Fragment的菜單項時,首先會調用Activity的onOptionsItemSelected()方法,若是該方法返回false,則調用Fragment實現的onOptionsItemSelected()方法。

應用圖標
     默認狀況下,應用圖標在ActionBar的左側
    當用戶點擊應用bar的時候,系統會調用你的Activity裏面的onOptionsItemSelected() 方法裏面的Android.R.id.Home ID(你的主ID)裏定義的事件。咱們能夠重寫這個方法,添加一個條件執行該行爲:讓它跳轉到這個應用的主Activity而不是返回的主屏幕。
    若是選擇返回應用的主activity,最好的方式是在建立的Intent中添加FLAG_ACTIVITY_CLEAR_TOP這個標籤。
    使用這個FLAG_ACTIVITY_CLEAR_TOP標籤,若是應用的主Activity已經在activity棧中存在,全部在其上的activity都會被銷燬,而後主activity會到棧頂,而不用建立主Activity的的新實例。

[java] 
@Override 
    public boolean onOptionsItemSelected(MenuItem item) 
    { 
        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: 
            return super.onOptionsItemSelected(item); 
        } 
    } 

 

          當咱們想實現用戶點擊ActionBar 圖標後返回前一個activity,能夠經過在Actionbar設置setDisplayHomeAsUpEnabled(true) 來實現。
[java] 
public class HomyUpActivity extends Activity { 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.main); 
    } 
    @Override 
    protected void onStart() { 
        super.onStart(); 
        ActionBar actionBar = this.getActionBar(); 
        actionBar.setDisplayHomeAsUpEnabled(true); 
    } 
    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
        MenuInflater inflater = getMenuInflater(); 
        inflater.inflate(R.menu.optionsmenu, menu); 
        return true; 
    } 
 

效果圖:

 


添加活動視圖
        咱們也能夠添加一個視圖做爲一個Action Item.咱們能夠經過在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 { 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.main); 
    } 
    @Override 
    protected void onStart() { 
        super.onStart(); 
        ActionBar actionBar = this.getActionBar(); 
        actionBar.setDisplayHomeAsUpEnabled(true); 
    } 
 
    @Override 
    public boolean onCreateOptionsMenu(Menu menu) 
    { 
        MenuInflater inflater = getMenuInflater(); 
        inflater.inflate(R.menu.optionsmenu, menu); 
        return true; 
    } 

效果圖:

 

ActionBar 標籤
        ActionBar能夠現實選項卡供用戶切換瀏覽該Activity中不一樣的Fragment
        每一個標籤均可以是一個圖標或文本標題

代碼示例:
       TabsActivity.java
[java]
public class TabsActivity extends Activity 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.main); 
        ActionBar bar = getActionBar(); 
        bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); 
        ActionBar.Tab tabA = bar.newTab().setText("A Tab"); 
        ActionBar.Tab tabB = bar.newTab().setText("B Tab"); 
        ActionBar.Tab tabC = bar.newTab().setText("C Tab"); 
        Fragment fragmentA = new AFragmentTab(); 
        Fragment fragmentB = new BFragmentTab(); 
        Fragment fragmentC = new CFragmentTab(); 
 
    } 
    tabA.setTabListener(new MyTabsListener(fragmentA)); 
    tabB.setTabListener(new MyTabsListener(fragmentB)); 
    tabC.setTabListener(new MyTabsListener(fragmentC)); 
    bar.addTab(tabA); 
    bar.addTab(tabB); 
    bar.addTab(tabC); 
    protected class MyTabsListener implements ActionBar.TabListener 
    { 
        private Fragment fragment; 
        public MyTabsListener(Fragment fragment) 
        { 
            this.fragment = fragment; 
        } 
        @Override 
        public void onTabSelected(Tab tab, FragmentTransaction ft) 
        { 
            ft.add(R.id.fragment_place, fragment, null); 
        } 
    } 
     

AFragmentTab.java
[java] 
public class AFragmentTab extends Fragment 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
            Bundle savedInstanceState) 
    { 
        return inflater.inflate(R.layout.fragment_a, container, false); 
    } 

BFragmentTab.java
[java] 
public class BFragmentTab extends Fragment 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
            Bundle savedInstanceState) 
    { 
        return inflater.inflate(R.layout.fragment_b, container, false); 
    } 

CFragmentTab.java
[java]
public class CFragmentTab extends Fragment 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
            Bundle savedInstanceState) 
    { 
        return inflater.inflate(R.layout.fragment_c, container, false); 
    } 

main.xml
[html] 
<LinearLayout xmlns: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> 

效果圖: 做者:aomandeshangxiao

相關文章
相關標籤/搜索