如何在MainActivity中关闭/折叠ActionBar中的SearchView?

22

我正在尝试在输入值后清空并关闭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() 不起作用,因为我的搜索不是一个视图而是一个小部件。


为什么不使用 setIconified() 方法?http://developer.android.com/reference/android/widget/SearchView.html#setIconified%28boolean%29 ?你不应该调用 onActionViewCollapsed() 方法。 - user
@Luksprog 它只在某种程度上起作用。它会删除已输入的查询并执行操作,但输入键盘不会隐藏,搜索字段也不会关闭。 - Kamil
你是如何再次搜索的?什么都没有发生?我已经检查了onActionViewCollapsed()和setIconfied(),它们都清除了文本,关闭了SearchView并移除了键盘。下一次搜索就可以了。 - user
下一次搜索正常工作 - 存在互联网连接问题。 setIconified() 清除了字段,但焦点没有丢失,光标在搜索字段中闪烁,键盘仍然打开。 onActionViewCollapsed() 不允许再次搜索,并隐藏字段而不清除第一个搜索的值。在下一次搜索中,它只是关闭键盘。我包含了 activity_main_actions.xml 的一部分,也许会有所帮助。 - Kamil
在我的情况下,必须连续调用两次 setIconified(true); 才能使其真正折叠。 - Chlind
请查看类似问题的答案:https://stackoverflow.com/a/46930606/1308990 - oiyio
7个回答

49

使用:

searchMenuItem.collapseActionView();

而不是:

searchView.onActionViewCollapsed();

如果你正在使用AppCompat库,那么请使用:

MenuItemCompat.collapseActionView(searchMenuItem);


你的回答解决了问题,我正在使用带有optionsMenu搜索项的toolbar - blueware
我和@blueware遇到了相同的情况,这个方法也解决了我的问题。谢谢! - Panda4Man

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

4

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

1

你好,我遇到了类似的情况,所以我认为这个修改后的代码应该能解决问题。
希望这有所帮助...:)

@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

活动:

if (!searchView.isIconified())
        search.collapseActionView();

碎片:

@Override
public void onPause() {
    super.onPause();
    if (!searchView.isIconified())
        search.collapseActionView();
}

1
看起来你正在寻找一种以编程方式关闭搜索栏的方法。不幸的是,目前没有相应的方法或替代方案。你可能已经看到了另一篇帖子,其中提供了一些建议,但并没有真正解决问题。
你上面第一个编辑调用的 setIconified(true) 是最好的替代方案。文档建议如果属性iconifiedByDefault为true(默认情况下是这样的),调用setIconified(true)应该会折叠搜索栏,清除它,并将其从焦点中移除,所以我认为你的 activity_main_actions.xml 没有任何问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接