2

検索ビューを含む 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();マークが出てアプリが終了します。

どうしたの?

4

1 に答える 1