facebook廣告





123

2017年1月29日 星期日

[Android] Menu xml 文件定義 − item 標籤的 android:showAsAction 屬性用途

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 以上
  1. ifRoom 及 always 屬性值用途:
  2. 如下 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>
    view rawcode2.xml hosted with ❤ by GitHub
    圖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>
    view rawcode3.xml hosted with ❤ by GitHub
     
    圖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>
    view rawcode4.xml hosted with ❤ by GitHub
    圖3 item0 與 item1 都顯示在動作列
    這是因為建構順序所造成的,上 menu_main.xml 檔會先建構 item0 再建構 item1。在建構 item0 時,動作列空間是足夠的,所以將 item0 放在動作列顯示;接著建構 item1,由於 item1 屬性值為 always,所以 item1 一定顯示在動作列。因此 item0 與 item1 都會顯示在動作列中。
  3. withText 及 never 屬性值用途:
  4. 如下 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>
    view rawcode5.xml hosted with ❤ by GitHub
    圖4 縱向螢幕
    圖5 橫向螢幕
    圖6 item1 顯示在選項選單
  5. collapseActionView 屬性值用途:
  6. 如下 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>
    view rawcode6.xml hosted with ❤ by GitHub
     
    圖7 (左)item0 點擊前,(右)item0 點擊後
備註:
  • 因為範例的 minSdkVersion 小於 Android API 21,必須使用 Android Support Library,所以是使用 app:showAsAction;如果 minSdkVersion 大於等於 Android API 21,直接使用 android:showAsAction 即可。
二、程式碼:
  1. MainActivity 使用的佈局資源檔(activity_main.xml):
  2. <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>
    view rawactivity_main.xml hosted with ❤ by GitHub
  3. OptionsMenu 使用的選單資源檔(menu_main.xml):
  4. 不同的屬性值測試,使用不同的選單資源檔。
  5. 測試 collapseActionView 屬性值時所使用的佈局資源檔(menu_layout.xml):
  6. <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal">
    <Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@android:string/ok" />
    <Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@android:string/no" />
    </LinearLayout>
    view rawmenu_layout.xml hosted with ❤ by GitHub
  7. MainActivity.java 檔:
  8. 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);
    }
    }
    view rawMainActivity.java hosted with ❤ by GitHub

沒有留言:

張貼留言