什麼是 Action View 和 Action Provider?
Action View
是一種Action,在App Bar中提供豐富的功能。如Search Action View可以讓使用者在App Bar中輸入搜尋文字而不必轉換Activity或Fragment。
Action Provider
是一種Action,並有客製化介面。一開始顯示為按鈕或menu item。當使用者點擊時,可以用任何方式控制 Action 的行為。
Android support library提供專門的Action View和Action Provider。 例如SearchView用於輸入搜索查詢,ShareActionProvider用於與其他應用程序共享的操作。也可以定義自己的Action View和 Action Provider。
加入 Action View
在 app/src /main/res目錄建立 menu 資源文件,並在其中新增<item>元素。<item>元素中加入以下屬性
actionViewClass:實作該action的類別。
actionLayout:佈局資源檔用來描述該action的外觀。
設定showAsAction屬性為“ifRoom | collapseActionView”或“never | collapseActionView”。
collapseActionView用來描述當使用者未互動時如何顯示。如果Action位於App Bar上顯示為icon。如果Action位於overflow menu,則顯示為menu item。當使用者和Action交互時,會填滿App Bar。如下在App Bar中加入 Search View
/app/src/main/res/menu/action_view_actions.xml
<?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/action_search"
android:title="search action"
android:icon="@android:drawable/ic_menu_search"
app:showAsAction="ifRoom|collapseActionView"
app:actionViewClass="androidx.appcompat.widget.SearchView" />
</menu>
若使用者未和Action互動時,會顯示為android:icon。若App Bar空間不足則顯示在overflow menu。
如果需要調整Action,可以在Activity的onCreateOptionsMenu方法實作。 可以通過呼叫getActionView方法獲取Action View的參考。 例如,以下為取得SearchView的參考
public class ActionViewActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_action_view);
Toolbar toolBar = findViewById(R.id.app_toolbar);
setSupportActionBar(toolBar);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.action_view_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);
}
}
啟動App 可以看到App Bar已經加入Search View。
點擊放大鏡icon會出現搜尋框讓使用者輸入內容。

關於如何更進一步的使用SearchView參考這裡https://developer.android.com/guide/topics/search/index.html
完整程式碼如下
/app/src/main/res/layout/activity_action_view.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
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"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".action_view_and_action_provider.ActionViewActivity">
<include
android:id="@+id/app_toolbar"
layout = "@layout/toolbar_main"
/>
</androidx.constraintlayout.widget.ConstraintLayout>
/app/src/main/res/manu/toolbar_main.xml
<?xml version="1.0" encoding="utf-8"?> <androidx.appcompat.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" android:background="?attr/colorPrimary" android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"> </androidx.appcompat.widget.Toolbar>
加入 Action Provider
在app/src /main/res目錄建立menu 資源文件,並在其中新增<item>元素。<item>元素中加入actionProviderClass屬性並對該屬性設定action provider完整路徑。如
androidx.appcompat.widget.ShareActionProvider
以下新增SharedActionProvider
app/src/main/res/menu/action_provider_actions.xml
<?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/action_shared"
android:title="shared action"
android:icon="@android:drawable/ic_menu_share"
app:showAsAction="ifRoom"
app:actionProviderClass="androidx.appcompat.widget.ShareActionProvider" />
</menu>
因為SharedActionProvider具有自己的icon,因此不必提供android:icon屬性。
實作 Action Provider 行為
透過在onCreateOptionsMenu方法內初始化ShareActionProvider,並設定其行為。
public class ActionProviderActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_action_provider);
Toolbar toolBar = findViewById(R.id.app_toolbar);
setSupportActionBar(toolBar);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.action_provider_actions, menu);
initShareActionProvider(menu);
return super.onCreateOptionsMenu(menu);
}
private void initShareActionProvider(Menu menu) {
MenuItem shareActionMenuItem = menu.findItem(R.id.action_shared);
ShareActionProvider shareActionProvider = (ShareActionProvider) MenuItemCompat.getActionProvider(shareActionMenuItem);
Intent sendAction = new Intent(Intent.ACTION_SEND);
sendAction.setType("text/plain");
sendAction.putExtra(Intent.EXTRA_TEXT, "share action text");
shareActionProvider.setShareIntent(sendAction);
}
}
啟動App可以看到一個分享的icon顯示在App Bar上。

點擊分享icon,會顯示要分享的方式。

完整程式碼如下
/app/src/main/res/layout/activity_action_provider.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
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"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".action_view_and_action_provider.ActionProviderActivity">
<include
android:id="@+id/app_toolbar"
layout="@layout/toolbar_main"
/>
</androidx.constraintlayout.widget.ConstraintLayout>
/app/src/main/res/menu/toolbar_main.xml
<?xml version="1.0" encoding="utf-8"?> <androidx.appcompat.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" android:background="?attr/colorPrimary" android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"> </androidx.appcompat.widget.Toolbar>
以上為Action View和Action Provider的範例。
以下為App Bar的相關內容
http://34.80.81.192/?p=6149
http://34.80.81.192/?p=6176
http://34.80.81.192/?p=6165
在〈加入 Action View 或 Action Provider 到 App Bar〉中有 3 則留言
[…] 加入 Action View 或 Action Provider 到 App Bar […]
[…] 加入 Action View 或 Action Provider 到 App Bar […]
[…] 加入 Action View 或 Action Provider 到 App Bar […]