2013年6月10日月曜日

Adding Recent Query Suggestions

Adding Recent Query Suggestions

前回の記事Action Barに検索Viewを設けるでは、入力欄を設けただけだった。ここで作業を終わってしまうのであれば、単なる、マニアである。SearchManagerはSuggestionsを利用してこそ有益になる。

Adding Recent Query Suggestionsに書かれているとおり下記のとおりサンプルプログラムを作ってみた。この記事で実現されるのは、利用者が過去に入力した文字列をそのまま候補として掲示することである。

public class MainActivity extends Activity{
    private final String TAG = "MainActivity";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu){
        getMenuInflater().inflate(R.menu.main, menu);
        SearchView sV;
        SearchManager sM = (SearchManager)getSystemService(Context.SEARCH_SERVICE);
        ComponentName c = getComponentName();
        SearchableInfo si = sM.getSearchableInfo(c);
        MenuItem mi = menu.findItem(R.id.action_Search);
        sV = (SearchView)mi.getActionView();
        sV.setSearchableInfo(si);
        sV.setIconifiedByDefault(false);
     
        /*
         * setSubmitButtonEnabled()について
         * trueは、送信ボタンが右端に表示される。
         * falseは、表示されない。
         */
        sV.setSubmitButtonEnabled(true);
     
        /*
         * setMaxWidth()について
         * これを設定しない場合、幅が狭い。このため設定した方が良い。
         * 引数には、物理画面の横幅の大きさを超える値を設定しても問題は無い。
         * 超えた値であっても、送信ボタンやアイコンは表示される。タイトル文字列は見えない。
         */
        DisplayMetrics metrics = new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(metrics);
        sV.setMaxWidth(metrics.widthPixels);
//        setTitle("");これは不要です。
        return true;
    }

    @Override
    protected void onNewIntent(Intent intent){
        setIntent(intent);
        if(Intent.ACTION_SEARCH.equals(intent.getAction())==true){
            String q = intent.getStringExtra(SearchManager.QUERY);
            SearchRecentSuggestions srs;
            srs = new SearchRecentSuggestions(this,
                MySuggestionProvider.AUTHORITY,
                MySuggestionProvider.MODE
                );
            srs.saveRecentQuery(q, null);
            Log.d(TAG, "onNewIntent() : query==" + q);
        }
    }
}

MySuggestionProvider.java
public class MySuggestionProvider extends SearchRecentSuggestionsProvider {
    public final static String AUTHORITY = "com.example.searchable.MySuggestionProvider";
    public final static int MODE = DATABASE_MODE_QUERIES;

    public MySuggestionProvider() {
        setupSuggestions(AUTHORITY, MODE);
    }
}


AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest
    xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.searchable"
    android:versionCode="1"
    android:versionName="1.0"
    >
    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="17"
        >
    </uses-sdk>
    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme"
        >
        <activity
            android:name=".MainActivity"
            android:launchMode="singleTop"
            >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
            <intent-filter>
                <action android:name="android.intent.action.SEARCH" />
            </intent-filter>
            <meta-data
                android:name="android.app.searchable"
                android:resource="@xml/searchable"
                />
        </activity>
        <provider
            android:name=".MySuggestionProvider"
            android:authorities="com.example.searchable.MySuggestionProvider"
            >
        </provider>
    </application>
</manifest>


res/xml/searchable.xml
<?xml version="1.0" encoding="utf-8"?>
<searchable
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:label="@string/app_name"
    android:hint="@string/SearchHint"
    android:searchSuggestAuthority="com.example.searchable.MySuggestionProvider"
    android:searchSuggestSelection=" ?"
    >
</searchable>