Android ActionBar 使用總結

本文根據Android Developer和SDK example的總結:

這裏所使用的都是appcompat v7 support library裏面的Actionbar。

添加ActionBar

  1. 創建一個Activity繼承ActionBarActivity.
  2. 給你的Activity指定“Theme.AppCompat”或者繼承它的一個主題。 例如:
<activity android:theme="@style/Theme.AppCompat.Light" ... >

刪除ActionBar

  可以在運行時隱藏ActionBar。例如:

ActionBar actionBar = getSupportActionBar();
actionBar.hide();

關於ActionBar的icon和logo

  1. 如果使用的是Material主題(>=API21)的時候,Navigation button(以前是“Home”)代替了之前應用icon的位置。也就是說L之後ActionBar左上角默認是Navigation button了而不是應用的icon或者logo。
  2. 通過調用getSupportActionBar().setDisplayOptions 修改DisplayOptions來改變ActionBar的顯示內容,DisplayOptions常量有5個,可以結合起來使用。
DisplayOptions Functions Description
DISPLAY_USE_LOGO setDisplayUseLogoEnabled 用LOGO代替標準的icon
DISPLAY_SHOW_HOME setDisplayShowHomeEnabled 顯示Home元素,包括logo和icon
DISPLAY_HOME_AS_UP setDisplayHomeAsUpEnabled 顯示Home元素並且承擔向上導航的功能(可以顯示返回箭頭)
DISPLAY_SHOW_TITLE setDisplayShowTitleEnabled 顯示Title和Subtitle
DISPLAY_SHOW_CUSTOM setDisplayShowCustomEnabled 顯示用戶自定義的View

Add and Handle Action Items

  1. 添加menu資源,要注意app:showAsAction 而不是 android:showAsAction,因爲我們用的support library裏面的ActionBar。 至於showAsAction的取值參考官網api。
<menu xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:app="http://schemas.android.com/apk/res-auto"
      xmlns:tools="http://schemas.android.com/tools">

    <item android:id="@+id/menu_refresh"
          android:title="Refresh"
          android:icon="@drawable/ic_action_refresh"
          app:showAsAction="ifRoom"/>   <!-- Using XML attributes from the support library -->

    <item android:id="@+id/menu_settings"
          android:title="Settings"
          android:icon="@drawable/ic_action_settings"
          app:showAsAction="never"/>
</menu>
  1. 在onCreateOptionsMenu中加載menu資源,可以通過menu.add來添加menu item,當然調用showAsAction時一定要用MenuItemCompat.setShowAsAction

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {

        getMenuInflater().inflate(R.menu.menu_actionbarcompat_basic, menu);

        MenuItem locationItem = menu.add(Menu.NONE, R.id.menu_location, 0, "Location");
        locationItem.setIcon(R.drawable.ic_action_location);
        // Need to use MenuItemCompat methods to call any action item related methods
        MenuItemCompat.setShowAsAction(locationItem, MenuItem.SHOW_AS_ACTION_IF_ROOM);

        return true;
    }

List Popup Menu

彈出菜單,PopupMenu 可以根據 構造函數裏的new PopupMenu(getActivity(), view) 參數 view來設置彈出位置的錨點。

   private void showPopupMenu(View view) {
        final PopupAdapter adapter = (PopupAdapter) getListAdapter();

        // Retrieve the clicked item from view's tag
        final String item = (String) view.getTag();

        // Create a PopupMenu, giving it the clicked view for an anchor
        PopupMenu popup = new PopupMenu(getActivity(), view);

        // Inflate our menu resource into the PopupMenu's Menu
        popup.getMenuInflater().inflate(R.menu.popup, popup.getMenu());

        // Set a listener so we are notified if a menu item is clicked
        popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
            @Override
            public boolean onMenuItemClick(MenuItem menuItem) {
                switch (menuItem.getItemId()) {
                    case R.id.menu_remove:
                        // Remove the item from the adapter
                        adapter.remove(item);
                        return true;
                }
                return false;
            }
        });

        // Finally show the PopupMenu
        popup.show();
    }

添加一個Action Provider

使用 ShareActionProvider

  1. 要使用帶有“ShareActionProvider”的share action,需要給item加一個tag指定ShareActionProvider class,如下:
<?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/menu_share"
          android:title="@string/menu_share"
          app:showAsAction="ifRoom"
    app:actionProviderClass="android.support.v7.widget.ShareActionProvider"/>
</menu>
  1. 在onCreateOptionsMenu中爲ShareActionProvider設置Intent。
private ShareActionProvider mShareActionProvider;

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.main_activity_actions, menu);

    // Set up ShareActionProvider's default share intent
    MenuItem shareItem = menu.findItem(R.id.menu_share);
    mShareActionProvider = (ShareActionProvider)
            MenuItemCompat.getActionProvider(shareItem);
    mShareActionProvider.setShareIntent(getDefaultIntent());

    return super.onCreateOptionsMenu(menu);
}

/** Defines a default (dummy) share intent to initialize the action provider.
  * However, as soon as the actual content to be used in the intent
  * is known or changes, you must update the share intent by again calling
  * mShareActionProvider.setShareIntent()
  */
private Intent getDefaultIntent() {
    Intent intent = new Intent(Intent.ACTION_SEND);
    intent.setType("image/*");
    //intent.putExtra(Intent.EXTRA_STREAM, getContentUri());  // 文件Uri
    // intent.setType("text/plain");
    //  intent.putExtra(Intent.EXTRA_TEXT, context.getString(contentResourceId)); // 文字
    return intent;
}

split action bar

split action bar可以分離bar到屏幕的底部去顯示所有的action items,前提是在小屏幕的手機上。(Android 5.0之後似乎被廢棄了,官方文檔上沒有明確說明,但是設置了卻不起作用。在設置了holo主題後纔有效果@android:style/Theme.Holo.Light.DarkActionBar)
開始分離action bar的功能需要做兩個事情。

  1. Add uiOptions=”splitActionBarWhenNarrow” to each element or to the element. This attribute is understood only by API level 14 and higher (it is ignored by older versions).
  2. To support older versions, add a element as a child of each element that declares the same value for “android.support.UI_OPTIONS”.
    例如:
<manifest ...>
    <activity uiOptions="splitActionBarWhenNarrow" ... >
        <meta-data android:name="android.support.UI_OPTIONS"
                   android:value="splitActionBarWhenNarrow" />
    </activity>
</manifest>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章