使用動作檢視畫面和動作供應程式

AndroidX 程式庫的 「Toolbar」提供 以不同方式吸引使用者與應用程式互動 請參閱「新增及處理動作」一文,瞭解如何 定義動作,可以是按鈕或選單項目。本文說明如何新增 兩種多功能元件:

  • 動作檢視是一種動作,可以在應用程式列中提供豐富的功能。適用對象 舉例來說,搜尋動作檢視畫面可讓使用者在應用程式列中輸入搜尋文字,而不必 來變更活動或片段
  • 動作供應程式是使用自訂版面配置的動作。最初操作 顯示為按鈕或選單項目當使用者輕觸動作時,動作供應程式會控制動作 動作行為會以您定義的方式運作。舉例來說,動作提供者可能會回應 以顯示選單就輕觸畫面

AndroidX 提供幾種特殊的動作檢視畫面和動作供應程式小工具。舉例來說, 「SearchView」小工具 實作可輸入搜尋查詢的動作檢視。 ShareActionProvider 小工具可實作動作供應程式,以便與其他應用程式分享資訊。您也可以製定 以及您動作檢視畫面和動作供應程式

新增動作檢視畫面

如要新增動作檢視畫面,請建立 <item>敬上 元素, 新增及處理動作。請在 <item> 元素:

  • actionViewClass:實作動作的小工具類別
  • actionLayout:說明動作元件的版面配置資源

showAsAction 屬性設為 "ifRoom|collapseActionView""never|collapseActionView"collapseActionView 標記會指示 在使用者未與小工具互動時顯示小工具。如果小工具位於應用程式列, 會以圖示的形式顯示小工具如果小工具位於溢位選單中,應用程式會顯示小工具 做為選單項目當使用者與動作檢視畫面互動時,會展開並填滿應用程式列。

舉例來說,以下程式碼會在應用程式列中新增 SearchView 小工具:

<item android:id="@+id/action_search"
     
android:title="@string/action_search"
     
android:icon="@drawable/ic_search"
     
app:showAsAction="ifRoom|collapseActionView"
     
app:actionViewClass="androidx.appcompat.widget.SearchView" />

如果使用者尚未與小工具互動,應用程式會將小工具顯示為指定的圖示 上傳者:android:icon。如果應用程式列沒有空間,應用程式會將該動作新增至 溢位選單

這張圖片顯示搜尋列,開頭和結尾圖示。
圖 1:含有開頭和結尾圖示的搜尋列。

使用者輕觸圖示或選單項目時,小工具會展開並填滿工具列, 使用者與容器的互動情形

這張圖片顯示聚焦搜尋列後開啟搜尋檢視畫面的圖片。
圖 2 將焦點移至搜尋列後,搜尋檢視畫面就會開啟。

如果需要設定動作,請在活動的 onCreateOptionsMenu() 回呼。您可以呼叫 getActionView() 方法。舉例來說,以下程式碼會取得 SearchView 的物件參照 先前程式碼範例定義的小工具:

KotlinJava
override fun onCreateOptionsMenu(menu: Menu?): Boolean {
    menuInflater
.inflate(R.menu.main_activity_actions, menu)

   
val searchItem = menu?.findItem(R.id.action_search)
   
val searchView = searchItem?.actionView as SearchView

   
// Configure the search info and add any event listeners.

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

   
MenuItem searchItem = menu.findItem(R.id.action_search);
   
SearchView searchView =
           
(SearchView) searchItem.getActionView();

   
// Configure the search info and add any event listeners.

   
return super.onCreateOptionsMenu(menu);
}

「回應動作檢視」展開模式

如果動作的 <item> 元素具有 collapseActionView 旗標, 應用程式會以圖示顯示動作檢視畫面,直到使用者與動作檢視畫面互動。當使用者 輕觸圖示、內建的處理常式 onOptionsItemSelected() 展開動作檢視畫面。如果您的活動子類別覆寫了 onOptionsItemSelected() 方法,您的覆寫方法必須呼叫 super.onOptionsItemSelected(),讓父類別展開動作檢視畫面。

如果您想要在展開或收合動作時執行操作,可以定義一個類別 implements MenuItem.OnActionExpandListener, 然後將該類別的成員傳送給 setOnActionExpandListener()。 舉例來說,您可能會想根據動作檢視畫面的展開或 已收合。下列程式碼片段說明如何定義及傳遞事件監聽器:

KotlinJava
override fun onCreateOptionsMenu(menu: Menu?): Boolean {
    menuInflater
.inflate(R.menu.options, menu)

   
// Define the listener.
   
val expandListener = object : MenuItem.OnActionExpandListener {
       
override fun onMenuItemActionCollapse(item: MenuItem): Boolean {
           
// Do something when the action item collapses.
           
return true // Return true to collapse the action view.
       
}

       
override fun onMenuItemActionExpand(item: MenuItem): Boolean {
           
// Do something when it expands.
           
return true // Return true to expand the action view.
       
}
   
}

   
// Get the MenuItem for the action item.
   
val actionMenuItem = menu?.findItem(R.id.myActionItem)

   
// Assign the listener to that action item.
    actionMenuItem
?.setOnActionExpandListener(expandListener)

   
// For anything else you have to do when creating the options menu,
   
// do the following:

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

   
// Define the listener.
   
OnActionExpandListener expandListener = new OnActionExpandListener() {
       
@Override
       
public boolean onMenuItemActionCollapse(MenuItem item) {
           
// Do something when the action item collapses.
           
return true;  // Return true to collapse action view.
       
}

       
@Override
       
public boolean onMenuItemActionExpand(MenuItem item) {
           
// Do something when it expands.
           
return true;  // Return true to expand the action view.
       
}
   
};

   
// Get the MenuItem for the action item.
   
MenuItem actionMenuItem = menu.findItem(R.id.myActionItem);

   
// Assign the listener to that action item.
   
MenuItemCompat.setOnActionExpandListener(actionMenuItem, expandListener);

   
// For anything else you have to do when creating the options menu,
   
// do the following:

   
return true;
}

新增動作供應程式

如要宣告動作供應程式,請在工具列的選單中建立 <item> 元素 資源,按照「新增及處理動作」一節所述。新增 actionProviderClass 屬性,並將其設為 動作提供者類別

舉例來說,以下程式碼宣告 ShareActionProvider,即小工具 這是 AndroidX 程式庫中定義的定義,可讓您的應用程式與其他應用程式分享資料:

<item android:id="@+id/action_share"
   
android:title="@string/share"
   
app:showAsAction="ifRoom"
   
app:actionProviderClass="androidx.appcompat.widget.ShareActionProvider"/>

在這種情況下,您不需要為小工具宣告圖示, ShareActionProvider 提供專屬圖形。如果您使用的是自訂動作 宣告圖示

其他資源

  • 詳情請見 ShareActionProvider 瞭解如何在頂端應用程式列中加入分享動作。
  • 詳情請見 ActionProvider: 進一步瞭解如何建立自訂動作供應程式。