这就是我浏览应用的方式:
当我从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} …Run Code Online (Sandbox Code Playgroud) 我在我的Android应用程序中有一个活动,它处理多个视图/片段的替换.此活动还有一个导航抽屉,可导航到顶级片段.从顶级片段,您可以导航到详细级别的片段.
可以通过从左侧滑入导航抽屉来访问导航抽屉.如果当前片段是顶级片段,则操作栏也可以访问导航抽屉.如果当前片段是详细级别片段,则可以返回操作栏(或按后退按钮).
假设我有3个顶级片段,可以通过导航抽屉访问.
fragment[1],fragment[2],fragment[3]
从fragment[1],您可以导航到详细级别fragment[1.1].
现在,用户想要fragment[3]从当前直接导航到顶级fragment[1.1].用户只需在导航抽屉中滑动并单击该项即可fragment[3].
现在,如果用户点击后退按钮,应用程序应该关闭(因为它导航到顶级片段).因此,每次用户导航到顶级片段时,都应清除堆栈.要检查是否应显示抽屉指示器,我正在读取getBackStackEntryCount() - 值并将其与0进行比较.
作为总结.我想从细节级别的片段导航到任何顶级片段并清除后台堆栈.
问题:
当我通过执行清除backstack时
getSupportFragmentManager().popBackStackImmediate(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);,
片段事务被反向重放(例如替换fragment[1]by fragment[1.1]).我不希望他们被重播.我在onCreateView,onViewCreated,onStart,..上有很多初始化,也开始获取数据的任务.我想跳过这一切.只需用一个尚未在Backstack中的新顶级视图替换详细级别视图.
在没有弹出事务的情况下,我找不到任何清除backstack的解决方案.
有没有一个干净的解决方案来处理这个问题?我是否必须实施自己的后台行为?
编辑: YouTube应用也表现得像这样.当您从详细信息导航到顶级时,后端堆栈将被清除.但他们如何在不重播片段交易的情况下清除后台堆叠?
谢谢你的回答.