【问题标题】:Resetting Search Widget (SearchView) value重置搜索小部件 (SearchView) 值
【发布时间】:2012-10-20 00:14:26
【问题描述】:

我有 2 个活动:第一个,HomepageActiviy,有一个搜索小部件,它使用另一个活动搜索数据,SearchActivity

我想要做的是,当我从 SearchActiviy 返回到 HomepageActivity 时,搜索小部件会折叠并显示一个空文本。

我已尝试执行以下操作:

public class HomepageActivity extends Activity {
    @TargetApi(11)
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.projectslist, menu);

        if(Build.VERSION.SDK_INT >= 11) {
            SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
            SearchView searchView = (SearchView) menu.findItem(R.id.homepage_search).getActionView();
            ComponentName component = new ComponentName(this, SearchActivity.class);
            searchView.setSearchableInfo(searchManager.getSearchableInfo(component));
            searchView.setIconifiedByDefault(true);
            searchView.setQuery("", false);

        }

        return super.onCreateOptionsMenu(menu);
    }

    […]

    @TargetApi(11)
    @Override
    protected void onRestart() {
        super.onRestart();
        if(Build.VERSION.SDK_INT >= 11)
            invalidateOptionsMenu();
        launchAsynchronousImageDownload();
    }
}

如果小部件很好地显示为折叠状态,小部件中的文本仍会记住搜索过的文本(在我重新打开小部件后)。 如何重置小部件的文本?

感谢您的帮助! ;)

【问题讨论】:

    标签: java android kotlin android-widget


    【解决方案1】:

    您还可以尝试以下方法:

    searchView.setQuery("", false);
    searchView.clearFocus();
    

    【讨论】:

    • 里面有乱七八糟的 searchView.setIconified(true);
    • @TarekEl-Mallah setIconified 将视图缩小为图标。仅尝试清除查询时,既不需要也不需要。
    【解决方案2】:

    这就是魔法

    searchView.setQuery("", false);//清除文字

    searchView.setIconified(true); //关闭搜索编辑器,重新制作搜索图标

    HomepageActivity中,在oncreate函数之后插入onSaveInstanceState函数

    每次打开新活动时都会触发此功能, 在打开新活动之前,它将重置 Search Widget 的值

      protected void onSaveInstanceState(Bundle outState) {
            super.onSaveInstanceState(outState);
             searchView.setQuery("", false);
            searchView.setIconified(true);
        }
    

    【讨论】:

      【解决方案3】:

      这对我有用:

      首先,我在活动的顶部声明了菜单项变量:

      private MenuItem mSearchMenuItem;
      

      我在 OnCreateOptionsMenu() 中定义了变量:

      mSearchMenuItem = menu.findItem(R.id.action_search);
      

      我在 onResume() 中声明了 invalidateOptionsMenu():

      @Override
      protected void onResume() {
          invalidateOptionsMenu();
          super.onResume();
      }
      

      最后,我在 onPrepareOptionsMenu() 的菜单项上调用了 collapseActionView()。

      @Override
      public boolean onPrepareOptionsMenu(Menu menu) {
          mSearchMenuItem.collapseActionView();
      
          return super.onPrepareOptionsMenu(menu);
      }
      

      【讨论】:

      • 在我看来它提供了最好的结果。将 searchView 设置为图标化并清除其焦点会将搜索图标带到左侧,而不是像从未单击过一样完全清除它。
      【解决方案4】:
      searchView.setQuery("", false);
      searchView.setIconified(false);
      

      【讨论】:

        【解决方案5】:

        我也遇到了这个问题,如果我把它放在 onPrepareOptionsMenu 中就可以了。

        @Override
        public boolean onPrepareOptionsMenu (Menu menu) {
             SearchView searchView = (SearchView) menu.findItem(R.id.action_search).getActionView();
             searchView.setQuery("", false);
             // rest of code...
        }
        

        【讨论】:

          【解决方案6】:

          科特林

          这是一个更清洁的解决方案,它修复了以下问题:

          1. 屏幕旋转后显示过滤列表的问题。
          2. 当用户切换到其他应用并返回时显示过滤列表的问题。
          3. 当用户返回时搜索菜单向左移动的问题。

          如果您要失效,则无需图标化,它会自动完成。


          override fun onSaveInstanceState(outState: Bundle) {
              super.onSaveInstanceState(outState)
              searchView.setQuery("", false)
              (activity as YourActivity).invalidateOptionsMenu()
          }
          

          确保将 YourActivity 更改为您的 Fragment 所在的 Activity 名称。

          【讨论】:

            【解决方案7】:

            刚刚找到了一种丑陋的方法来使其工作(阅读 cmets 以查看差异):

            public class HomepageActivity extends Activity {
                // Declaring SearchView as an instance object
                private SearchView searchView;
            
                @TargetApi(11)
                @Override
                public boolean onCreateOptionsMenu(Menu menu) {
                    MenuInflater inflater = getMenuInflater();
                    inflater.inflate(R.menu.projectslist, menu);
            
                    if(Build.VERSION.SDK_INT >= 11) {
                        SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
                        // Using instance var instead of local var
                        searchView = (SearchView) menu.findItem(R.id.homepage_search).getActionView();
                        ComponentName component = new ComponentName(this, SearchActivity.class);
                        searchView.setSearchableInfo(searchManager.getSearchableInfo(component));
                        searchView.setIconifiedByDefault(true);
                        // Setting query is not anymore required
                        //searchView.setQuery("", false);
                    }
            
                    return super.onCreateOptionsMenu(menu);
                }
            
                […]
            
                @TargetApi(11)
                @Override
                protected void onRestart() {
                    super.onRestart();
                    // Do not need to recreate menu
                    /*if(Build.VERSION.SDK_INT >= 11)
                        invalidateOptionsMenu();*/
                    if(Build.VERSION.SDK_INT >= 11) {
                        // Calling twice: first empty text field, second iconify the view
                        searchView.setIconified(true);
                        searchView.setIconified(true);
                    }
                    launchAsynchronousImageDownload();
                }
            }
            

            我认为这很丑陋,所以如果有人有更好的主意,请告诉我:)

            【讨论】:

            • 你好@kyriog..虽然我回答得太晚了..但我遇到了同样的问题。在 onRestart() 方法中,我首先清空了文本字段,然后将视图图标化。它解决了我的问题,无需调用 setIconified() 两次。 searchView.setQuery("",false);searchView.setIconified(true);
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-04-25
            • 1970-01-01
            • 2016-04-23
            相关资源
            最近更新 更多