web-dev-qa-db-ja.com

MainActivityのActionBarでSearchViewを閉じる/閉じる/折りたたむ方法は?

値を入力した後、SearchViewをクリアして閉じようとしています。解決策を見つけましたが、検索を終了し、再度検索しようとしてもアクションを実行しません。

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.activity_main_actions, menu);

    searchView = (SearchView) menu.findItem(R.id.action_search).getActionView();
    searchView.setOnQueryTextListener(searchListener);

    return super.onCreateOptionsMenu(menu);
}

SearchView.OnQueryTextListener searchListener = new SearchView.OnQueryTextListener(){
    @Override
    public boolean onQueryTextChange(String arg0) {
        return false;
    }
    @Override
    public boolean onQueryTextSubmit(String query) {
        new JsoupGetData("http://api.openweathermap.org/data/2.5/find?q="+ query + "&lang=pl").execute();
        try {
            searchView.onActionViewCollapsed();
        }
        catch(Exception ex){
            ex.printStackTrace();
            System.out.println(ex);
        }
        return true;
    }
};

初めてしか検索できません。次回は入力キーボードを閉じるだけで、何もしません。どうすれば正しい方法で実行できますか?

編集。推奨される変更は次のようになります。

        try {
            searchView.setIconified(true);
        }

activity_main_actions.xml:

   <!-- Search Widget -->
   <item Android:id="@+id/action_search"
       Android:icon="@drawable/ic_action_search"
       Android:title="@string/action_search"
       Android:showAsAction="always"
       Android:actionViewClass="Android.widget.SearchView"/>

編集2:

私が変更され showAsAction="always|collapseActionView"しかし、検索をクリックするとアプリが閉じます。

また、OnCreateOptionsMenu内にリスナーを配置して、リスナーが何かを変更するかどうかを確認します。

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.activity_main_actions, menu);
    searchMenuItem = menu.findItem(R.id.action_search); 
    searchView = (SearchView) searchMenuItem.getActionView();
    searchView.setOnQueryTextListener(new OnQueryTextListener(){

            @Override
            public boolean onQueryTextChange(String arg0) {
                return false;
            }

            @Override
            public boolean onQueryTextSubmit(String query) {
                if (searchMenuItem != null) {
                    boolean closed = searchMenuItem.collapseActionView();
                    Toast.makeText(getApplicationContext(), "closing: " + closed, Toast.LENGTH_SHORT).show();
                }
                new JsoupGetData("http://api.openweathermap.org/data/2.5/find?q="+ query + "&lang=pl").execute();
                return false;
            }
    });    
    return super.onCreateOptionsMenu(menu);
}

closedブール値はfalseです-理由はわかりません。 ドキュメント を読みましたが、何もわかりません。

編集3:

このテーマについてインターネットを読みすぎましたが、まだはっきりしていません。検索ウィジェットがクリアされ、キーボードが非表示になり、アクションが実行されます。唯一の問題は、検索が折りたたまれていないため、ActionBarの残りのアクションボタンがカバーされることです。

            @Override
            public boolean onQueryTextSubmit(String query) {
                searchView.setIconified(true);
                searchView.clearFocus();
                new JsoupGetData("http://api.openweathermap.org/data/2.5/find?q="+ query + "&lang=pl").execute();
                return false;
            }

ここ 私の検索はビューではなくウィジェットであるため、collapseActionView()が機能しないことを読みました。

21
Kamil

使用する:

searchMenuItem.collapseActionView();

の代わりに:

searchView.onActionViewCollapsed();

_AppCompat library_を使用している場合は、次を使用します。

MenuItemCompat.collapseActionView(searchMenuItem);

45
Newinjava

私の場合、invalidateOptionsMenu();を呼び出すとSearchViewが閉じます

12
Rafael

言及された解決策 ここ は簡単で、完璧に機能します。

基本的に、SearchViewsetQuery("", false)およびsetIconified(true)を呼び出します。

3
Darshan Dorai

Menu_main.xmlに以下を追加します。

<item Android:id="@+id/action_search"
    Android:icon="@Android:drawable/ic_menu_search"
    Android:title="Search"
    app:showAsAction="collapseActionView|ifRoom"
    Android:orderInCategory="1"
    app:actionViewClass="Android.support.v7.widget.SearchView"
    Android:menuCategory="secondary"
    />

およびonCreateOptionsMenu

final  MenuItem miSearch = menu.findItem(R.id.action_search);
    SearchView searchView = (SearchView) miSearch.getActionView();
    searchView.setQueryHint("Searh For");
    searchView.setOnQueryTextListener(newSearchView.OnQueryTextListener() {
        @Override
        public boolean onQueryTextSubmit(String query) {
            Toast.makeText(context,query, Toast.LENGTH_LONG).show();
            // Here Put Your Code.
            //searchView.onActionViewCollapsed();
            miSearch.collapseActionView();
            return false;
        }

        @Override
        public boolean onQueryTextChange(String newText) {
            return false;
        }
    });
3
Khaled Jas

探しているのは、プログラムで検索バーを閉じる方法のようです。残念ながら、これに対する方法または同等の回避策はありません。 別の投稿 を見たことがあるかもしれませんが、これにはいくつかの提案がありましたが、これを行う実際の方法はありません。

setIconified(true)を呼び出す上記の最初の編集が最良の選択肢です。ドキュメントでは、setIconified(true)を呼び出すと、検索ウィジェットが折りたたまれ、クリアされ、属性iconifiedByDefaultがtrueの場合はフォーカスから削除されることが推奨されます(デフォルトでは問題がないため、 activity_main_actions.xmlで)。

1
strwils

こんにちは、私は同様のシナリオに直面したので、コードに変更したことでうまくいくと思います。
お役に立てれば...:)

@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_main_actions, menu);
Menu mMenuItem = menu.findItem(R.id.action_search_loc);  // take a reference with menue item
searchView = (SearchView) mMenuItem.getActionView(); //use that to find searchview
searchView.setOnQueryTextListener(searchListener);

return super.onCreateOptionsMenu(menu);
}

SearchView.OnQueryTextListener searchListener = new SearchView.OnQueryTextListener(){
@Override
public boolean onQueryTextChange(String arg0) {
    return false;
}
@Override
public boolean onQueryTextSubmit(String query) {
    new JsoupGetData("http://api.openweathermap.org/data/2.5/find?q="+ query +    "&lang=pl").execute();
    try {
        mMenuItem.collapseActionView(); //this will collapse your search view
    }
    catch(Exception ex){
        ex.printStackTrace();
        System.out.println(ex);
    }
    return true;
}
};
1
Max