片段替换触发searchView上的onQueryTextChange

Tom*_*Tom 19 android state save android-fragments searchview

这就是我浏览应用的方式:

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

当我从list-detail-fragment导航时,我希望将searchview的当前过滤器保存在字符串变量中.我在执行onQueryTextChange时存储searchview的值.

问题:我无法存储实际的过滤器值,因为当我从列表导航到详细信息时会调用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...
}
Run Code Online (Sandbox Code Playgroud)

当我想在导航回来时恢复过滤器时,它只是使用空字符串过滤,因为存储了错误的值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}
Run Code Online (Sandbox Code Playgroud)

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

谢谢.

Pra*_*ani 5

经过2天的谷歌搜索,我得到了肯定会为您提供帮助的解决方案。

我刚刚cut and pasted从代码onCreateOptionMenu()onPrepareOptionMenu()

我不知道为什么会这样,我认为监听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);
}
Run Code Online (Sandbox Code Playgroud)

并删除:

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    super.onCreateOptionsMenu(menu, inflater);
}
Run Code Online (Sandbox Code Playgroud)

谢谢 :)


小智 5

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

防止倒塌

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

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

也可以通过重写SearchView的onActionViewCollapsed()方法来防止崩溃,但是什么也做不到。

适当时忽略查询更改

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

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

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


Tom*_*Tom 1

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

<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item
            android:id="@+id/actionSearch"
            android:icon="@android:drawable/ic_menu_search"
            android:actionViewClass="android.widget.SearchView"
            android:showAsAction="always"
            android:title="@android:string/search_go"
    />
</menu>
Run Code Online (Sandbox Code Playgroud)