这是我如何浏览我的应用程序:
- 使用列表打开片段
- 按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...
}
字符串
当我想在返回时恢复过滤器时,它只使用空字符串进行过滤,因为错误的值存储在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}
型
如何防止搜索视图在导航时被系统清除?
- 谢谢-谢谢
9条答案
按热度按时间jmo0nnb31#
经过2天的谷歌搜索,我得到了解决方案,肯定会帮助你。
我只有
cut and pasted
代码从onCreateOptionMenu()
到onPrepareOptionMenu()
我不知道为什么会发生这种情况,我认为
searchView
的侦听器不会变成NULL
,你可以这样修改你的代码。字符串
和删除:
型
谢谢您的支持:)
wfauudbj2#
问题是ActionBar(和子组件)在包含它的片段被替换时会折叠。发生这种情况时,SearchView查询将被清除,如onActionViewCollapsed中所示。解决方法包括:
防止崩溃
从searchview的创建代码中删除
setShowAsAction(MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW);
或从其xml代码中删除android:showAsAction="collapseActionView"
。也可以通过覆盖SearchView的onActionViewCollapsed()方法来防止崩溃,但不会做任何事情。
适当时忽略查询更改
当片段无效(被替换)时,则忽略查询更改,否则这些更改将导致片段更改其保存的查询文本或布局(如果片段实际上没有视图内容,则更改布局将导致异常)。
字符串
这将是更好的选择,因为它不会影响搜索视图的功能。
blmhpbnm3#
我看到你还没有找到解决方案,我有相同的problem张贴here:
我发现当调用
invalidateOptionsMenu
时,也会调用onQueryTextChange
方法,因为View会在清除搜索后使用先前的值启动dispatchRestoreInstanceState
。你叫invalidateOptionsMenu
吗?也许,在
onQueryTextChange
中,您可以检查应用程序对象的某些当前状态的布尔值,以了解是否应该执行 * 方法content*。在我的例子中,我使用mDrawerLayout.isDrawerOpen(..)
来允许搜索。您还可以在您使用的每个类上实现
SearchView.OnQueryTextListener
,在Fragment
或Main Activity类上,您可以在类的某处设置一个布尔模块变量,您将在onQueryTextChange.
中检查该变量huus2vyu4#
我将菜单项属性
showAsAction
从android:showAsAction="always|collapseActionView"
修改为android:showAsAction="always"
。现在,searchview的外观和行为发生了一些变化,但是searchQuery没有被清除!字符串
jei2mxaa5#
使用
androidx.appcompat.widget.SearchView
+LiveData
+ViewModel
:字符串
3gtaxfhh6#
如果有人遇到同样的问题,当SearchView当前展开时,在菜单XML文件中使用以下操作替换Fragment时,将触发onQueryTextChange回调:
字符串
当您尝试在onQueryTextChange回调中使用isVisible()(Java)或isVisible(Kotlin)作为确定片段是否实际可见的方法时,返回的值将始终返回true。
这样做的原因是,当您尝试更改Fragment的SearchView当前展开时,将触发onQueryTextChange回调。
在此阶段,collapseActionView的默认动作是在更改Fragment的时候,折叠SearchView。
解决方案:
只需调用您的SearchView**!isIconified**(Kotlin)方法,只有当它返回false时才设置逻辑,即SearchView当前已展开。完整示例描述如下:
型
0h4hbjxa7#
字符串
当片段更改searchView触发时,我不知道为什么,但通过检查这个
newText.isNullOrBlank()
,我解决了我的问题,也许它可以帮助别人eufgjt7s8#
不幸的是,所有提出的解决方案对我来说都没有帮助,因为我必须在SearchView上保留
collapseActionView|ifRoom
属性,并且我不想检查SearchView查询的空性/空性。因此,每当查询发生变化,或者片段被另一个片段替换时,
onQueryTextChange
回调就会被执行->,并且查询被清空(这会导致一些问题)。😬字符串
我用
isRemoving
检查我的Fragment当前是否正在从Activity中删除,并且我直接返回true
,以便在片段被另一个片段删除/替换时“不做任何事情”。70gysomp9#
这是我的解决方案:
字符串