小编Tom*_*Tom的帖子

片段替换触发searchView上的onQueryTextChange

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

  • 用列表打开片段
  • 按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} …
Run Code Online (Sandbox Code Playgroud)

android state save android-fragments searchview

19
推荐指数
3
解决办法
3645
查看次数

清除backstack并用顶级片段替换当前片段

我在我的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应用也表现得像这样.当您从详细信息导航到顶级时,后端堆栈将被清除.但他们如何在不重播片段交易的情况下清除后台堆叠?

谢谢你的回答.

android transactions fragment clear back-stack

5
推荐指数
1
解决办法
672
查看次数