【问题标题】:How to dismiss/close/collapse SearchView in ActionBar in MainActivity?如何在 MainActivity 的 ActionBar 中关闭/关闭/折叠 SearchView?
【发布时间】:2014-07-18 15:48:18
【问题描述】:

我正在尝试在输入值后清除并关闭 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 - 我不知道为什么。我读了the doc,但它什么也没告诉我。

编辑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;
            }

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

【问题讨论】:

  • 你为什么不使用 setIconified() developer.android.com/reference/android/widget/… ?你不应该调用 onActionViewCollapsed()。
  • @Luksprog 它仅部分起作用。它会删除键入的查询并执行操作,但输入键盘未隐藏且搜索字段未关闭。
  • 您究竟是如何再次搜索的?什么都没发生?我已经检查了 onActionViewCollapsed() 和 setIconfied() 并且都清除了文本,关闭了 SearchView 并移除了键盘。下次搜索没问题。
  • 下一个搜索正常 - 存在 Internet 连接问题。 setIconified() 清除字段,但焦点没有丢失,光标在搜索字段中闪烁,键盘仍然打开。 onActionViewCollapsed() 不允许再次搜索,它会隐藏该字段而不删除第一次搜索中的值。在接下来的搜索中,它只是关闭键盘。我包含了 activity_main_actions.xml 的一部分,也许它会有所帮助
  • 就我而言, setIconified(true);在实际折叠之前必须按顺序调用两次。

标签: android android-actionbar searchview


【解决方案1】:

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

您在上面调用setIconified(true) 的第一个编辑是最好的选择。文档建议调用setIconified(true) 应该折叠搜索小部件,清除它,如果属性iconifiedByDefault 为真,则将其从焦点中移除(默认情况下它是这样,所以我看不到你的activity_main_actions.xml 有任何问题)。

【讨论】:

    【解决方案2】:

    您好,我遇到了类似的情况,所以我认为这更改为代码应该可以解决问题。
    希望这会有所帮助...:)

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

    【讨论】:

      【解决方案3】:

      用途:

      searchMenuItem.collapseActionView();

      代替:

      searchView.onActionViewCollapsed();

      如果您使用的是AppCompat library,则使用:

      MenuItemCompat.collapseActionView(searchMenuItem);

      【讨论】:

      • 你的回答成功了,我使用toolbaroptionsMenu 搜索项。
      • 我的情况与@blueware 相同,这也解决了我的问题。谢谢!
      【解决方案4】:

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

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

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          【解决方案6】:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-11-19
            • 2021-10-03
            • 2015-01-18
            • 2013-08-25
            • 2019-12-09
            • 1970-01-01
            相关资源
            最近更新 更多