【问题标题】:Restore state of android's search view widget恢复android的搜索视图小部件的状态
【发布时间】:2014-04-30 04:53:53
【问题描述】:

我的操作栏中有一个搜索视图,我想在方向更改后恢复查询。我怎样才能做到这一点?使用 SearchView.setQuery(query, false); 从捆绑包中设置查询不起作用,因为搜索视图在展开后立即将其查询设置为 ""

这是我onActivityCreated中的相关代码:

if(savedInstanceState != null && savedInstanceState.containsKey(BUNDLE_KEY_SEARCH))
    mCurFilter = savedInstanceState.getString(BUNDLE_KEY_SEARCH);

这里是我的onSaveInstanceState

savedInstanceState.putString(BUNDLE_KEY_SEARCH, mCurFilter);
super.onSaveInstanceState(savedInstanceState);

那么我怎样才能恢复它的状态,因为我无法使用setQuery 来做到这一点? 谢谢大家

【问题讨论】:

    标签: java android android-fragments android-widget searchview


    【解决方案1】:

    作为一种解决方法,更换您的

    mSearchView.setQuery(mSearchText, false); 
    

    与:

    final String s = mSearchText;
    
    mSearchView.post(new Runnable() {
    
        @Override
        public void run() {
            mSearchView.setQuery(s, false);
        }
    });
    

    系统设置空字符串后会设置保存的字符串。

    【讨论】:

    • 谢谢,我试试这个。
    【解决方案2】:

    是的,可以恢复搜索视图小部件的状态:

    使用以下代码保存搜索查询文本:

    private String mSearchQuery;
    
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater menuInflater = getMenuInflater();
    
        menuInflater.inflate(R.menu.search_menu, menu);
    
        // Associate searchable configuration with the SearchView
        SearchManager searchManager =
                (SearchManager) getSystemService(Context.SEARCH_SERVICE);
        SearchView searchView =
                (SearchView) menu.findItem(R.id.search).getActionView();
    
      searchView.setSearchableInfo(
                searchManager.getSearchableInfo(getComponentName()));
    
        if(mSearchQuery != null){
            searchView.setIconified(true);
            searchView.onActionViewExpanded();
            searchView.setQuery(mSearchQuery, false);
            searchView.setFocusable(true);
        }
    
        searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener(){
    
            @Override
            public boolean onQueryTextSubmit(String query) {
                return false;
            }
    
            @Override
            public boolean onQueryTextChange(String newText) {
                mSearchQuery = newText;
                return false;
            }
        });
    
        return true;
    }
    
     @Override
    protected void onSaveInstanceState(Bundle outState) {
        outState.putString("searchQuery", mSearchQuery);
        super.onSaveInstanceState(outState);
    }
    

    然后在Activity的OnCreate()方法中,添加如下几行:

        if(savedInstanceState != null){
            mSearchQuery = savedInstanceState.getString("searchQuery");
        }
    

    【讨论】:

      【解决方案3】:

      当您展开 SearchView 时,有更好的(在我看来)方法(不发布 Runnable)来避免将查询设置为 "" .

      1) 您将需要一个 String 变量来存储查询。

      //String that you fill in onQueryTextChange
      String searchText;
      //String, that is filled after you restore previous
      String queryToSave;
      

      2) 从 Bundle 获取查询后,将其存储在另一个变量中。

      if(this.searchText!=null)
      {
          this.queryToSave=this.searchText;
      }
      

      3) 在 onQueryTextChange(String query) 中,您将 searchText 变量填充为文本,如果为空则填充为 null

      4) 在 onMenuItemActionExpand(MenuItem item) 中,您需要将恢复的字符串 (searchText) 保存到另一个变量 (queryToSave),因为它(searchText) 将在调用 onQueryTextChange 后设置为空文本

      if(searchText!=null)
      {
          queryToSave=new StringBuffer(searchText).toString();
      }
      

      5) 所以现在如果你打电话给

      mSearchView.setQuery(queryToSave, false);
      

      展开 SearchView 后,queryToSave 不会为空,您会看到展开后的 SearchView 包含您恢复的文本!

      【讨论】:

        【解决方案4】:

        你应该这样做:

        import android.support.v4.view.MenuItemCompat;
        import android.support.v7.app.AppCompatActivity;
        import android.os.Bundle;
        import android.support.v7.widget.SearchView;
        import android.view.Menu;
        import android.view.MenuItem;
        
        public class MainActivity extends AppCompatActivity {
        
            private SearchView mSearchView;
            private String mSearchString;
            private static final String SEARCH_KEY = "search";
        
            @Override
            protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_main);
                // if you saved something on outState you can recover them here
                if (savedInstanceState != null) {
                    mSearchString = savedInstanceState.getString(SEARCH_KEY);
                }
            }
        
            // This is called before the activity is destroyed
            @Override
            protected void onSaveInstanceState(Bundle outState) {
                super.onSaveInstanceState(outState);
                mSearchString = mSearchView.getQuery().toString();
                outState.putString(SEARCH_KEY, mSearchString);
            }
        
            @Override
            public boolean onCreateOptionsMenu(Menu menu) {
                getMenuInflater().inflate(R.menu.main, menu);
        
                MenuItem searchMenuItem = menu.findItem(R.id.menu_main_action_search);
        
                mSearchView = (SearchView) MenuItemCompat.getActionView(searchMenuItem);
        
                //focus the SearchView
                if (mSearchString != null && !mSearchString.isEmpty()) {
                    searchMenuItem.expandActionView();
                    mSearchView.setQuery(mSearchString, true);
                    mSearchView.clearFocus();
                }
        
                return super.onCreateOptionsMenu(menu);
            }
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-08-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-01-04
          • 2019-12-16
          相关资源
          最近更新 更多