Tom*_*Tom 19 android state save android-fragments searchview
这就是我浏览应用的方式:
当我从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)
如何在导航时阻止系统清除搜索视图?
谢谢.
经过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的功能。
我将菜单项属性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)