アクション ビューとアクション プロバイダを使用する

<ph type="x-smartling-placeholder">

AndroidX ライブラリの Toolbar が提供する機能 ユーザーがさまざまな方法でアプリを操作できます。 次の方法については、アクションの追加と処理をご覧ください。 ボタンまたはメニュー項目であるアクションを定義します。このドキュメントでは、Google Chat で 2 つの多目的なコンポーネントがあります

  • アクション ビューは、アプリバー内に豊富な機能を提供するアクションです。対象 たとえば検索アクション ビューでは、ユーザーが アクティビティやフラグメントを変更できます。
  • アクション プロバイダは、独自のカスタマイズされたレイアウトを持つアクションです。最初のアクションは ボタンまたはメニュー項目として表示されます。ユーザーがアクションをタップすると、アクション プロバイダが 定義できます。たとえば、アクション プロバイダが特定のアクションに タップ操作に使用できます。

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);
}
<ph type="x-smartling-placeholder">

アクション ビューの拡大に対応する

アクションの <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: カスタム アクション プロバイダの作成に関する詳細をご覧ください。