標題欄 Toolbar

從 Android 3.0(API 級別 11)開始,全部使用默認主題的 Activity 均使用 ActionBar 做爲應用欄。不過,通過不一樣 Android 版本的演化,原生 ActionBar 的行爲會隨 Android 系統的版本而發生變化。相比之下,ActionBar的最新功能已添加到支持庫版本的 Toolbar 中,而且這些功能能夠在任何可以使用該支持庫的設備上使用。android

所以,應該使用支持庫的 Toolbar 類來實現 Activity 的應用欄。使用支持庫的工具欄有助於確保應用在最大範圍的設備上保持一致的行爲。例如,Toolbar 小部件可以在運行 Android 2.1(API 級別 7)或更高版本的設備上提供 Material Design 體驗,但除非設備運行的是 Android 5.0(API 級別 21)或更高版本,不然原生操做欄不會支持 Material Design。app

向Activity添加工具欄

向項目添加v7 appcompat 支持庫ide

compile 'com.android.support:appcompat-v7:25.3.1'

Activity擴展AppCompatActivity工具

在應用清單中,將<application>元素的主題設置爲appcompat的其中一個NoActionBar主題。使用這些主題中的一個防止應用使用原生ActionBar類提供應用欄。例如:佈局

<application
    android:theme="@style/Theme.AppCompat.Light.NoActionBar"
    />

因爲我想改變標題欄中的文字顏色,因此自定義了一個主題繼承上例中的主題:code

<style name="AppTheme.Base" parent="Theme.AppCompat.Light.NoActionBar">
        <item name="android:textColorPrimary">@android:color/white</item>
    </style>
<application
        android:theme="@style/AppTheme.Base">

向Activity的佈局添加一個Toolbar。例如,如下佈局代碼能夠添加一個Toolbar並賦予其浮動在Activity之上的外觀:xml

<android.support.v7.widget.Toolbar
   android:id="@+id/my_toolbar"
   android:layout_width="match_parent"
   android:layout_height="?attr/actionBarSize"
   android:background="?attr/colorPrimary"
   android:elevation="4dp"
   android:theme="@style/ThemeOverlay.AppCompat.ActionBar"
   app:popupTheme="@style/ThemeOverlay.AppCompat.Light"/>

在 Activity 的 onCreate() 方法中,調用 Activity 的 setSupportActionBar() 方法,而後傳遞 Activity 的工具欄。該方法會將工具欄設置爲 Activity 的應用欄。例如:對象

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_my);
    Toolbar myToolbar = (Toolbar) findViewById(R.id.my_toolbar);
    setSupportActionBar(myToolbar);
    }

使用應用欄的方法繼承

將工具欄設置爲 Activity 的應用欄後,就能夠訪問 v7 appcompat 支持庫的 ActionBar 類提供的各類實用方法。您能夠經過此方法執行許多有用的操做,例如隱藏和顯示應用欄。utf-8

要使用 ActionBar 實用方法,調用 Activity 的 getSupportActionBar() 方法。此方法將返回對 appcompat ActionBar 對象的引用。得到該引用後,就能夠調用任何一個 ActionBar 方法來調整應用欄。例如,要隱藏應用欄,請調用 ActionBar.hide()。

修改標題內容

個人MainActivity使用FragmentTabHost來管理三個Fragment。想使每一個Fragment對象不一樣的標題能夠在Fragment中修改Title:

@Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        if (mLayout == null) {
            mLayout = inflater.inflate(R.layout.fragment_line, container, false);

        }
        ((AppCompatActivity)getActivity()).getSupportActionBar().setTitle("線路");
        return mLayout;
    }

添加操做

添加操做按鈕

在res中建立menu文件夾,在menu文件夾中建立menu xml文件line_menu.xml:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">
    <item android:id="@+id/change_line"
          android:title="線路"
          app:showAsAction="always"/>

</menu>

覆蓋Activity的onCreateOptionsMenu方法:

@Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.line_menu, menu);
        return true;
    }

根據不一樣的Fragment顯示不一樣的按鈕

如上文所述,個人MainActivity使用FragmentTabHost來管理三個Fragment。要想使每一個Fragment對應不一樣的按鈕,能夠覆蓋Activity的onPrepareOptionsMenu方法:

@Override
    public boolean onPrepareOptionsMenu(Menu menu) {
        switch(mTabHost.getCurrentTab()){
            case 2 :
                menu.findItem(R.id.change_line).setVisible(true);
                break;
            default:
                menu.findItem(R.id.change_line).setVisible(false);
                break;
        }
        return super.onPrepareOptionsMenu(menu);
    }

而後給FragmentTabHost設置OnTabChangeListener,調用invalidateOptionsMenu()方法,使Activity從新加載menu,即調用onPrepareOptionsMenu方法:

mTabHost.setOnTabChangedListener(new TabHost.OnTabChangeListener() {
            @Override
            public void onTabChanged(String tabId) {
                invalidateOptionsMenu();
            }
        });

設置按鈕響應

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case R.id.action_settings:
            // User chose the "Settings" item, show the app settings UI...
            return true;

        case R.id.action_favorite:
            // User chose the "Favorite" action, mark the current item
            // as a favorite...
            return true;

        default:
            // If we got here, the user's action was not recognized.
            // Invoke the superclass to handle it.
            return super.onOptionsItemSelected(item);

    }
}
相關文章
相關標籤/搜索