1. 程式人生 > >Android程式設計權威指南(第二版)學習筆記(二十五)—— 第25章 搜尋

Android程式設計權威指南(第二版)學習筆記(二十五)—— 第25章 搜尋

本章主要講了 ToolBar 中的 SearchView 的使用以及 SharedPreferences 的簡單使用。

GitHub 地址:
完成第25章

1. SearchView

SearchView 是一個 ActionView(操作檢視),所謂操作檢視,就是可以內建在工具欄中的檢視。SearchView 可以讓整個搜尋介面完全內建在應用的工具欄中。

1.1 SearchView 的建立

首先我們建立選單資源:

<?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/menu_item_search" android:title="@string/search" app:actionViewClass="android.support.v7.widget.SearchView" app:showAsAction="ifRoom" /> </menu
>

可以發現我們多了一個 app:actionViewClass 屬性,這個就是指定這個 item 的 actionView 類。

現在只要我們在 onCreateOptionsMenu 中引用該選單資源,就能看到 SearchView 了。

1.2 SearchView 的使用

我們現在能看到 SearchView,當然還要讓其能夠進行相應的工作:首先獲取例項,然後設定回撥方法。

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    super.onCreateOptionsMenu(menu, inflater);
    inflater.inflate(R.menu.fragment_photo_gallery, menu);

    // 在這裡獲取這個 ActionView
MenuItem searchItem = menu.findItem(R.id.menu_item_search); final SearchView searchView = (SearchView) searchItem.getActionView(); searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { @Override public boolean onQueryTextSubmit(String query) { // 點選提交後 return true; } @Override public boolean onQueryTextChange(String newText) { // 文字改變時呼叫 Log.d(TAG, "QueryTextChange: " + newText); return false; } }); searchView.setOnSearchClickListener(new View.OnClickListener() { @Override public void onClick(View v) { String query = QueryPreferences.getStoredQuery(getActivity()); searchView.setQuery(query, false); } }); }

2. 使用 SharedPreferences 實現輕量級資料儲存

shared preferences 本質上就是檔案系統中的檔案,可使用 SharedPreferences 類讀寫它。 SharedPreferences 例項用起來更像一個鍵值對倉庫(類似於 Bundle),但它可以通過持久化儲存儲存資料。鍵值對中的鍵為字串,而值是原子資料型別。進一步檢視 shared preferences 檔案可知,它們實際上是一種簡單的 XML 檔案,但 SharedPreferences 類已遮蔽了讀寫檔案的實現細節。shared preferences 檔案儲存在應用沙盒中,所以,類似密碼這樣的敏感資訊不應該用它來儲存。
要獲得定製的 SharedPreferences 例項 , 可使用 Context.getSharedPreferences (String,int)方法。然而,在實際開發中,我們並不關心具體是什麼樣的 SharedPreferences 例項,只要它能共享於整個應用就可以了。這種情況下,最好使用PreferenceManager. getDefaultSharedPreferences(Context)方法,該方法會返回具有私有許可權和預設名稱的例項(僅在當前應用內可用)。

一個示例的 SharedPreferences 操作類如下:

public class QueryPreferences {
    private static final String PREF_SEARCH_QUERY = "searchQuery";

    public static String getStoredQuery(Context context) {
        return PreferenceManager.getDefaultSharedPreferences(context)
                .getString(PREF_SEARCH_QUERY, null);
    }

    public static void setStoredQuery(Context context, String query) {
        PreferenceManager.getDefaultSharedPreferences(context)
                .edit()
                .putString(PREF_SEARCH_QUERY, query)
                .apply();
    }
}