http://dreammushroomsprogramnotes.blogspot.tw/2015/09/android-menu-xml-item_13.html
一、android:showAsAction 屬性用途: showAsAction 屬性是項目(item)顯示在動作列(Action Bar)的方式(Action Bar 必須使用 Android API 11 以上或使用Android Support Library),有以下屬性值可以選擇(可以用『|』讓項目同時擁有多個屬性值):
屬性值 | 說明 |
ifRoom | 如果動作列有空間,項目放在動作列 |
withText | 項目顯示包含項目標題(android:title) 這是一種暗示,不保證一定會包含項目標題,當 Android 系統認為有足夠的空間時,將包含項目標題 |
never | 項目不放在動作列(放在選項選單) |
always | 項目一定放在動作列 避免使用這個屬性,除非項目是非常關鍵的,設定有多個項目為 always 屬性,可能導致項目部份重疊 |
collapseActionView | 項目與子項目可摺疊起來 必須宣告子項目(android:actionLayout 或 android:actionViewClass) 需 Android API 14 以上 |
- ifRoom 及 always 屬性值用途:
如下 menu_main.xml 檔中,item0 的屬性值為 always;item1 的屬性值為 ifRoom,所以 item0 一定放在動作列;item1 在動作列空間足夠的情況下放在動作列中,不然就放在選項選單。
| <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" |
| tools:context=".MainActivity"> |
|
|
| <item |
| android:id="@+id/item0" |
| android:title="Enable" |
| app:showAsAction="always" /> |
| <item |
| android:id="@+id/item1" |
| android:title="Disable" |
| app:showAsAction="ifRoom" /> |
| </menu> |
圖1 動作列空間足夠,item1 顯示在動作列
將 item1 的標題文字增加後,動作列空間不夠顯示 item1 之內容,因此 item1 就放在選項選單,如下 menu_main.xml 檔。
| <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" |
| tools:context=".MainActivity"> |
|
|
| <item |
| android:id="@+id/item0" |
| android:title="Enable" |
| app:showAsAction="always" /> |
| <item |
| android:id="@+id/item1" |
| android:title="ABCDEFGHIJKLMNOPQRSTUVWXYZ" |
| app:showAsAction="ifRoom" /> |
| </menu> |
圖2 動作列空間不足,item1 顯示在選項選單
ifRoom 屬性值與項目的順序有關,將 item0 屬性值設為 ifRoom、item1 屬性值設為 always 時,其結果會完全不同,如下 menu_main.xml 檔。
| <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" |
| tools:context=".MainActivity"> |
|
|
| <item |
| android:id="@+id/item0" |
| android:title="Enable" |
| app:showAsAction="ifRoom" /> |
| <item |
| android:id="@+id/item1" |
| android:title="ABCDEFGHIJKLMNOPQRSTUVWXYZ" |
| app:showAsAction="always" /> |
| </menu> |
圖3 item0 與 item1 都顯示在動作列
這是因為建構順序所造成的,上 menu_main.xml 檔會先建構 item0 再建構 item1。在建構 item0 時,動作列空間是足夠的,所以將 item0 放在動作列顯示;接著建構 item1,由於 item1 屬性值為 always,所以 item1 一定顯示在動作列。因此 item0 與 item1 都會顯示在動作列中。
- withText 及 never 屬性值用途:
如下 menu_main.xml 檔中,item0 的屬性值有 withText 並有設定圖示屬性(android:icon),當動作列空間足夠時,item0 會顯示圖示及標題(圖4及圖5);item1 的屬性值為 never,所以 item1 會顯示在選項選單(圖6)。
| <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" |
| tools:context=".MainActivity"> |
|
|
| <item |
| android:id="@+id/item0" |
| android:title="Enable" |
| android:icon="@mipmap/ic_launcher" |
| app:showAsAction="ifRoom|withText" /> |
| <item |
| android:id="@+id/item1" |
| android:title="Disable" |
| app:showAsAction="never" /> |
| </menu> |
圖4 縱向螢幕
圖5 橫向螢幕
圖6 item1 顯示在選項選單
- collapseActionView 屬性值用途:
如下 menu_main.xml 檔中,item0 的屬性值有 collapseActionView 並有設定動作列佈局屬性(app:actionLayout),若點擊 item0 會切換到 item0 所設定的動作列佈局。
| <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" |
| tools:context=".MainActivity"> |
|
|
| <item |
| android:id="@+id/item0" |
| android:title="Enable" |
| app:actionLayout="@layout/menu_layout" |
| app:showAsAction="ifRoom|collapseActionView" /> |
| <item |
| android:id="@+id/item1" |
| android:title="Disable" |
| app:showAsAction="never" /> |
| </menu> |
圖7 (左)item0 點擊前,(右)item0 點擊後
備註:
- 因為範例的 minSdkVersion 小於 Android API 21,必須使用 Android Support Library,所以是使用 app:showAsAction;如果 minSdkVersion 大於等於 Android API 21,直接使用 android:showAsAction 即可。
二、程式碼:
- MainActivity 使用的佈局資源檔(activity_main.xml):
| <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" |
| xmlns:tools="http://schemas.android.com/tools" |
| android:layout_width="match_parent" |
| android:layout_height="match_parent" |
| android:paddingBottom="@dimen/activity_vertical_margin" |
| android:paddingLeft="@dimen/activity_horizontal_margin" |
| android:paddingRight="@dimen/activity_horizontal_margin" |
| android:paddingTop="@dimen/activity_vertical_margin" |
| tools:context=".MainActivity"> |
|
|
| <TextView |
| android:id="@+id/text" |
| android:layout_width="wrap_content" |
| android:layout_height="wrap_content" |
| android:text="@string/hello_world" /> |
|
|
| </RelativeLayout> |
- OptionsMenu 使用的選單資源檔(menu_main.xml):
不同的屬性值測試,使用不同的選單資源檔。
- 測試 collapseActionView 屬性值時所使用的佈局資源檔(menu_layout.xml):
- MainActivity.java 檔:
| package com.dreammushrooms.blogger_menuresource; |
|
|
| import android.support.v7.app.ActionBarActivity; |
| import android.os.Bundle; |
| import android.view.Menu; |
| import android.view.MenuItem; |
| import android.widget.TextView; |
|
|
|
|
| public class MainActivity extends ActionBarActivity { |
|
|
| @Override |
| protected void onCreate(Bundle savedInstanceState) { |
| super.onCreate(savedInstanceState); |
| super.setContentView(R.layout.activity_main); |
| } |
|
|
| @Override |
| public boolean onCreateOptionsMenu(Menu menu) { |
| super.getMenuInflater().inflate(R.menu.menu_main, menu); |
| return true; |
| } |
|
|
| @Override |
| public boolean onOptionsItemSelected(MenuItem item) { |
| final int id = item.getItemId(); |
| final TextView text = (TextView) super.findViewById(R.id.text); |
| if (id == R.id.item0) { |
| text.setEnabled(true); |
| return true; |
| } else if (id == R.id.item1) { |
| text.setEnabled(false); |
| return true; |
| } |
| return super.onOptionsItemSelected(item); |
| } |
| } |
沒有留言:
張貼留言