片段替换触发searchView上的onQueryTextChange

这是我浏览我的应用程序的方式:

  • 用列表打开片段
  • searchview中输入的文本过滤列表
  • 点击listitem(列表片段被细节片段替换)
  • 向后导航(详细信息片段被列表片段替换)

当我从list-detail-fragment导航时,我希望将searchview的当前filter保存在字符串variables中。 我在执行onQueryTextChange时存储searchview的值。

问题:我无法存储实际的filter值,因为当我从列表导航到详细信息时会调用onQueryTextChange,因为有些东西清除了searchview的文本。

// ... searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { @Override public boolean onQueryTextSubmit(String s) { return false; } @Override public boolean onQueryTextChange(String s) { searchReceived(s); return true; } }); // ... public void searchReceived(String searchQuery) { this.stateHolder.searchQuery = searchQuery; // more code... } 

当我想在导航回来时恢复filter时,它只是使用空字符串过滤,因为错误的值存储在this.stateHolder.searchQuery

堆栈:

     onQueryTextChange():139, EmployeeListFragment$1 {com.example.exampleapp.fragment} onTextChanged():1153, SearchView {android.widget} access$2000():92, SearchView {android.widget} onTextChanged():1638, SearchView$11 {android.widget} sendOnTextChanged():7408, TextView {android.widget} setText():3816, TextView {android.widget} setText():3671, TextView {android.widget} setText():80, EditText {android.widget} setText():3646, TextView {android.widget} setQuery():511, SearchView {android.widget} onActionViewCollapsed():1250, SearchView {android.widget} collapseItemActionView():1662, ActionBarView$ExpandedActionViewMenuPresenter {com.android.internal.widget} collapseItemActionView():1258, MenuBuilder {com.android.internal.view.menu} clear():521, MenuBuilder {com.android.internal.view.menu} doInvalidatePanelMenu():789, PhoneWindow {com.android.internal.policy.impl} run():221, PhoneWindow$1 {com.android.internal.policy.impl} 

    在导航时如何防止系统清除搜索视图?

    谢谢。

    Related of "片段替换触发searchView上的onQueryTextChange"

    经过两天的谷歌搜索后,我得到的解决方案肯定会对你有所帮助。

    我刚刚cut and pasted onCreateOptionMenu()代码cut and pastedonPrepareOptionMenu()

    我不知道为什么会发生这种情况,我认为通过这种方式更改代码的方式, searchView监听器不会是NULL

     @Override public void onPrepareOptionsMenu(Menu menu) { super.onPrepareOptionsMenu(menu); getSherlockActivity().getSupportMenuInflater().inflate(R.menu.menu_all_order, menu); searchView = (SearchView) menu.findItem(R.id.menu_all_order_search).getActionView(); searchView.setInputType(InputType.TYPE_CLASS_NUMBER); searchView.setQueryHint("Enter Order No"); searchView.setOnQueryTextListener(this); } 

    并删除:

     @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { super.onCreateOptionsMenu(menu, inflater); } 

    谢谢 :)

    我看到你还没有find解决方案,我在这里发布了同样的问题 :

    我发现当调用invalidateOptionsMenu也会调用onQueryTextChange方法,因为在您清除搜索之后,View会启动dispatchRestoreInstanceState以及之前的值。 你可以打电话给invalidateOptionsMenu吗?

    也许, onQueryTextChange ,您可以检查应用程序对象的某些当前状态的布尔值,以了解是否应该执行方法内容 。 在我的例子中,我使用mDrawerLayout.isDrawerOpen(..)来允许搜索。

    您还可以在您使用的每个类上,在Fragment或Main Activity类上实现SearchView.OnQueryTextListener ,在类的某个位置,您可以设置一个布尔模块variables,您将在onQueryTextChange.检查onQueryTextChange.

    问题是ActionBar(和子组件)在替换持有它的片段时会崩溃。 发生这种情况时,将清除SearchView查询,如onActionViewCollapsed中所示 。 解决方法包括:

    防止崩溃

    删除setShowAsAction(MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW); 来自searchview的创建代码或android:showAsAction="collapseActionView"来自其xml代码。

    这将影响在尝试折叠视图时关闭/语音搜索按钮的显示方式/时间

    也可以通过重写SearchView的onActionViewCollapsed()方法来防止崩溃,但不会做任何事情,但会完成相同的操作。

    适当时忽略查询更改

    当片段无效(被替换)时,忽略查询更改,否则会导致片段更改其保存的查询文本或布局(如果片段实际上没有视图内容,则更改布局会导致exception)。

     public boolean onQueryTextChange(String newText) { if (!isVisible()) { // The fragment was replaced so ignore return true; } // Text was actually changed, perform search return true; } 

    这将是更好的选择,因为它不会影响searchview的function。

    我将android:showAsAction="always|collapseActionView"的菜单项属性showAsAction修改为android:showAsAction="always" 。 现在,searchview的外观和行为发生了一些变化,但是searchQuery没有被清除!

        

    这是我的解决方案:

      @Override public boolean onQueryTextChange(final String newText) { if (searchTF.isIconified()) return false; // put the "real" onQueryTextChange actions here return true; }