検索ビューを含む SearchableActivity を構築しています。
ユーザーが検索を送信するSearchableActivity
と、結果が表示されます。同時に、オプション メニュー名「To Result List」に 1 つの項目が追加されます。これは、検索結果をリスト レイアウトで表示する ResultListActivity にリダイレクトされます。
ワークフローは次のように記述できます。
1 ユーザーは、アクション バーの検索アイコンをクリックし、何かを入力して送信します。
2SearchableActivity
新しいインテントでクエリを受け取り、検索ジョブを実行します。
3 結果を受け取り、表示します。そして最も重要な仕事は、「To Result List」項目を含む新しいメニュー レイアウト ファイルでメニューを膨らませて、オプション メニューを無効にすることです。
4 ユーザーが「結果リストへ」を押したら、 を起動しResultListActivity
ます。
私はほとんど仕事をしました:
public class SearchableActivity extends ActionBarActivity {
private TextView textView;
private SearchView searchView;
private int status = 0;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.search_searchable);
textView = (TextView) findViewById(R.id.result);
handleIntent(getIntent());
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
switch (status) {
case 0:
getMenuInflater().inflate(R.menu.home_default, menu);
break;
case 1:
getMenuInflater().inflate(R.menu.home_2, menu);
break;
}
setupSearchView(menu);
return super.onCreateOptionsMenu(menu);
}
private void setupSearchView(Menu menu) {
SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
searchView = (SearchView) MenuItemCompat.getActionView(menu.findItem(R.id.action_search));
searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
searchView.clearFocus();
}
@Override
protected void onNewIntent(Intent intent) {
setIntent(intent);
handleIntent(intent);
}
private void handleIntent(Intent intent) {
if (Intent.ACTION_SEARCH.equals(intent.getAction())) {
String query = intent.getStringExtra(SearchManager.QUERY);
performSearch(query);
}
}
private void performSearch(String query) {
textView.setText(query + " result \n");
status = 1;
searchView.clearFocus();
ActivityCompat.invalidateOptionsMenu(this);
}
}
home_default.xml:
...
<item
android:id="@+id/action_search"
android:title="@string/action_search"
android:icon="@drawable/ic_menu_search"
com.demo:actionViewClass="android.support.v7.widget.SearchView"
com.demo:showAsAction="always|collapseActionView"/>
...
home_2.xml:
...
<item
android:id="@+id/action_search"
android:title="@string/action_search"
android:icon="@drawable/ic_menu_search"
com.demo:actionViewClass="android.support.v7.widget.SearchView"
com.demo:showAsAction="always|collapseActionView"/>
<item
android:id="@+id/action_toResultList"
android:title="@string/action_toList"
com.demo:showAsAction="always"/>
...
ただし、いくつかの問題があります。
1 ワークフローのステップ 3 で、オプション メニューを無効にして新しい項目を追加しますが、メニューが再び膨らむと、次のSerchView
ようにフォーカスされ、入力キーボードが表示されることがわかりました。
コードが示すように、私は を呼び出しましたsearchView.clearFocus()
が、動作しないようです。
そして、私がその行にコメントすると
ActivityCompat.invalidateOptionsMenu(this);
検索後の画面は次のようになります。
2 検索後に画面の向きを変えるとNullPointException
アットsearchView.clearFocus();
マークが出てアプリが終了します。
どうしたの?