【问题标题】:How to remove a Fragment?如何删除片段?
【发布时间】:2020-04-10 02:33:36
【问题描述】:

我有一个在 Activity 中扩展 DialogFragment 的片段。我在单击按钮时显示它:

 FragmentManager fragmentManager = getSupportFragmentManager();
 FragmentTransaction ft = fragmentManager.beginTransaction();
 ft.add(TabsFragment.newInstance(), "Fragment");
 ft.addToBackStack(null);
 ft.commit();

而在 Fragment 的 onDismiss 方法中,我以这种方式将其删除:

FragmentManager fragmentManager = getChildFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
if (fragmentManager.getBackStackEntryCount() > 0)
    fragmentManager.popBackStack();
fragmentTransaction.commit();

所以,我的问题是,当我快速单击按钮两次时,会出现两个片段。我将这些代码替换为 Activity:

FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction ft = fragmentManager.beginTransaction();
if (fragmentManager.getBackStackEntryCount() == 0) {
    ft.add(TabsFragment.newInstance(), "Fragment");
    ft.addToBackStack("Tabs");
    ft.commit();
}

但是这样一来,Fragment 只显示一次。当我点击按钮 getBackStackEntryCount 为 0 并显示片段。当片段解散并再次单击按钮时,getBackStackEntryCount 为 1,尽管我在 onDismiss 方法中删除了片段。是否有其他方法可以删除片段和低值 getBackStackEntryCount

【问题讨论】:

  • 我认为更好的方法是限制快速点击按钮。因为我认为核心问题不在于片段删除。
  • @OlegSkidan 我可以使用处理程序等,但我认为这种方式很脏!

标签: android android-fragments


【解决方案1】:

试试这个;

fragmentTransaction.hide(fragment1);
fragmentTransaction.commit();

【讨论】:

  • 使用hide()方法,片段没有被破坏,它会导致内存泄漏。
【解决方案2】:

好吧,如果你不想弄脏,那么... 1. 使用流行的库,比如 rx。因为它是编写代码的更清晰的方式。

implementation 'io.reactivex.rxjava2:rxandroid:2.1.1'
implementation 'io.reactivex.rxjava2:rxjava:2.2.12'
  1. 使用https://github.com/JakeWharton/RxBinding 它可以帮助您更舒适地处理视图。

一个例子:

RxView.clicks(yourButton)
            .throttleFirst(1000, TimeUnit.MILLISECONDS)
            .subscribe (click -> {your code})

其中 RxView.clicks - 是您的 onClickListener, .throttleFirst - 是你的延迟 .subscribe - 是您的点击操作

你可以做得更好。只需将一些部分包装在方法中 =)

编辑。为什么它是更好的方法?因为它有助于解决核心问题(快速点击)。无助于解决善后问题。

【讨论】:

  • 我不会限制第一次点击。当用户认为他可能没有正确单击它时,第二次单击可能来自片段的缓慢生成。我会在第一次点击后禁用按钮,直到片段出现。
  • 你不想在片段处于创建/加载阶段时显示进度条吗?
  • 我使用bottomNavigationView,我的按钮就是其中的一个项目。我如何使用这个库处理onNavigationItemSelected
猜你喜欢
  • 2019-03-17
  • 1970-01-01
  • 2012-04-03
  • 1970-01-01
  • 2015-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多