如何在MainActivity中解除/关闭/解除ActionBar中的SearchView?

时间:2014-05-29 07:40:28

标签: android android-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"/>

EDIT2:

我更改了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 - 我不知道为什么。我读了the doc,但它什么也没告诉我。

EDIT3:

我在这个问题上读了太多的互联网,但我还不清楚。清除搜索小部件,隐藏键盘并执行操作。唯一的问题是搜索没有折叠,因此它覆盖了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;
            }

Here我读到collapseActionView()不起作用,因为我的搜索不是视图而是窗口小部件。

6 个答案:

答案 0 :(得分:45)

使用:

searchMenuItem.collapseActionView();

而不是:

searchView.onActionViewCollapsed();

如果您使用AppCompat library,请使用:

MenuItemCompat.collapseActionView(searchMenuItem);

答案 1 :(得分:10)

在我的情况下,调用invalidateOptionsMenu();会关闭SearchView

答案 2 :(得分:3)

提到的解决方案here很简单,效果很好。

基本上,在setQuery("", false)上致电setIconified(true)SearchView

答案 3 :(得分:3)

在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;
        }
    });

答案 4 :(得分:1)

听起来你正在寻找的是一种以编程方式关闭搜索栏的方法。不幸的是,没有方法或等效的解决方法。您可能已经看到another post有一些建议,但没有真正的方法可以做到这一点。

上面第一次调用setIconified(true)是最好的选择。文档建议调用setIconified(true)应该折叠搜索小部件,清除它,并在属性iconifiedByDefault为真时将其从焦点中移除(默认情况下这样,我不会发现任何问题你的activity_main_actions.xml)。

答案 5 :(得分:0)

嗨,我遇到了类似的情况,所以我认为这改为代码应该做的伎俩 希望这有助于...... :)

@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;
}
};