在Android3.0之後,Google對UI導航設計上進行了一系列的改革,其中有一個非常好用的新功能就是引入的ActionBar,他用於取代3.0之前的標題欄,並提供更爲豐富的導航效果。ActionBar的主要目的是:
1.提供一個用於識別應用程序的標示和用戶的位置的專用空間。
2.在不同的應用程序之間提供一致的導航和視覺體驗。
3.突出Activity的關鍵操作(如“搜索”、“創建”、“共享”等),並且在可預見的方法內給用戶提供快捷的訪問。
今天我們就簡單梳理一下如何通過ActionBar爲標題添加“搜索”和“分享”的操作視窗,如下圖:
操作視窗是作爲操作項目按鈕的替代品顯示在操作欄中的一個可視構件。例如,如果你有一個用於搜索的可選菜單項,你可以用Searchview類來替代操作欄上的搜索按鈕。
要個菜單資源中的一個項目聲明一個操作視窗,你既可以使用android:actionLayout屬性也android:actionviewClass屬性來分別指定一個佈局資源或要使用的可視構件類。
與操作視窗類似,操作提供器(由ActionProvider類定義的)用一個定製的佈局代替一個操作項目,它還需要對所有這些項目行爲的控制。當你在操作欄中給一個菜單項聲明一個操作項目時,它不僅要一個定製的佈局來控制這個菜單項的外觀,而且當它在顯示在溢出菜單中時,還要處理它的默認事件。無論是在操作欄中還是在溢出菜單中,它都能夠提供一個子菜單。例如,ActionProvider的擴展類ShareActionProvider,它通過在操作欄中顯示一個有效的共享目標列表來方便共享操作。與使用傳統的調用ACTION_SEND類型Intent對象的操作項不同,你能夠聲明一個ShareActionProvider對象來處理一個操作項。這種操作提供器會保留一個帶有處理ACTION_SEND的Intent對象的應用程序的下拉列表,使這個菜單項顯示在溢出菜單中。因此,當你使用像這樣的操作提供器時,你不必處理有關這個菜單項的用戶事件。要給一個操作項聲明一個操作提供器,就要在菜單資源中對應的<item>元素中定義android:actionProviderClass屬性,提供器要使用完整的類名。
第一步:建立menu資源文件
建立menu資源文件,設置搜索和分享的ITEM功能組件。
(1)新建menu文件夾,如圖
(2)在menu資源文件夾下建立serch_share_menu.xml文件(自定義名稱)
(3)serch_share_menu.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/search"
app:actionViewClass="android.support.v7.widget.SearchView"
android:icon="@android:drawable/ic_menu_search"
android:orderInCategory="100"
android:title="搜索"
app:showAsAction="always|collapseActionView" />
<item
android:id="@+id/share"
android:icon="@android:drawable/ic_menu_share"
android:orderInCategory="200"
android:title="共享"
app:actionProviderClass="android.support.v7.widget.ShareActionProvider"
app:showAsAction="ifRoom" />
</menu>
第二步:java中功能實現代碼MainActivity.java:
import android.content.Intent;
import android.support.v4.view.MenuItemCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.SearchView;
import android.support.v7.widget.ShareActionProvider;
import android.view.Gravity;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Toast;
/**
* Created by panchengjia on 2016/12/23.
*/
public class MainActivity extends AppCompatActivity {
SearchView searchView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
//使用菜單填充器獲取menu下的菜單資源文件
getMenuInflater().inflate(R.menu.search_share_menu,menu);
//獲取搜索的菜單組件
MenuItem menuItem = menu.findItem(R.id.search);
searchView = (SearchView) MenuItemCompat.getActionView(menuItem);
//設置搜索的事件
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
Toast t = Toast.makeText(MainActivity.this, query, Toast.LENGTH_SHORT);
t.setGravity(Gravity.TOP,0,0);
t.show();
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
return false;
}
});
//獲取分享的菜單子組件
MenuItem shareItem = menu.findItem(R.id.share);
ShareActionProvider shareActionProvider = (ShareActionProvider) MenuItemCompat.getActionProvider(shareItem);
//通過setShareIntent調用getDefaultIntent()獲取所有具有分享功能的App
shareActionProvider.setShareIntent(getDefaultIntent());
return super.onCreateOptionsMenu(menu);
}
//設置可以調用手機內所有可以分享圖片的應用
private Intent getDefaultIntent() {
Intent intent = new Intent();
intent.setAction(Intent.ACTION_SEND);
//這裏的類型可以按需求設置
intent.setType("image/*");
return intent;
}
}
雖然用actionBar可以實現這些功能,但在各個安卓版本和定製Rom中的效果表現不一,導致嚴重的碎片化問題,所以Google在2015的IO大會上發佈了系列的Material Design風格的控件。其中ToolBar是替代ActionBar的控件。後面我們也會簡述ToolBar的簡單用法。