【问题标题】:Android fragmentTransaction IssueAndroid fragmentTransaction 问题
【发布时间】:2015-07-21 09:48:09
【问题描述】:

我正在创建一个在其主要活动中使用导航抽屉的应用程序。在抽屉中,用户可以浏览 8 个不同的片段。我目前正在使用

fragmentTransaction.replace(R.id.container,MyFragment)

浏览片段,但对于用户体验来说并不是最好的,因为它每次都会重新加载片段并且导航抽屉滑动不流畅。我尝试使用

fragmentTransaction.add(R.id.container,MyFragment)

然后隐藏所有其他片段,但它变得令人困惑并且它不能很好地工作,特别是当从另一个片段调用片段时。有没有一种方法可以让导航更加流畅,而无需在每次选择片段时都重新加载?

【问题讨论】:

  • 我认为在内存中保留 8 个片段并不是一个好主意。我会选择容器活动,所以 1 个片段 1 个活动,或类似的东西。
  • 你能不能解释的更清楚些?
  • 您可以使用一个活动作为父项,并在其中实例化一个特定片段(8 个中的 1 个)。这样,当您导航抽屉时,您将启动一个新活动(带有复制的抽屉)。解决方案取决于片段之间的语义相关性。如果它们是原子的、孤立的,请尝试上述解决方案,如果它们以某种方式相关,您可以考虑使用选项卡并使用选项 setOffscreenPageLimit(3) 查看寻呼机。
  • 两种解决方案(查看寻呼机和活动)通常一次显示一个片段,因此您无需隐藏其他片段。如果您要使用视图寻呼机并且有一些代码应该在用户可见特定片段时执行,您可以使用 onPageSelected(来自 ViewPager.OnPageChangeListener)。

标签: android


【解决方案1】:

我建议使用fragmentTransaction.add(R.id.container,MyFragment) 来避免重新加载问题,并在添加之前进行检查,这将检查您的片段(您要添加的片段)是否已经退出回栈,如果是,则从后面选择stack else 添加一个新实例。

【讨论】:

  • 我知道,但是使用 add 和 show 和 hide 处理 8 个片段非常令人困惑
  • 我可以在主要活动中做到这一点,但我如何检查片段是否是从片段内部添加的?
  • 把这个函数放在你的基础活动中:- public void addFragmentWithBackStack(Fragment fragment, Fragment launcherFragment) { if (你在这里检查) { } getSupportFragmentManager().beginTransaction() .add(R.id. mainFragmentContainer,片段,fragment.getClass().getSimpleName()) .hide(getSupportFragmentManager().findFragmentByTag(launcherFragment.getClass().getSimpleName())) .addToBackStack(fragment.getClass().getSimpleName()) .commit( ); }
  • @IvanoDonadi:查看这里以检查现有片段-stackoverflow.com/a/15042122/1384010
  • 好吧,试试吧。你知道一种方法可以隐藏所有其他添加的片段,而不是一个一个地隐藏它们吗?
【解决方案2】:

分段事务的最佳方法是使用 backstack...它将当前片段放入 backstack 并在用户导航返回时加载它...查看下面的示例代码...

FirstFragment firstFragment = new FirstFragment();
getSupportFragmentManager().beginTransaction().addToBackStack(null)
                .add(R.id.content_frame, firstFragment).commit();

如果你想要一个流畅的片段交易,你可能不得不使用自定义动画来进行片段交易......网上有很多教程......

如果你想保存片段的当前状态检查this answer...

【讨论】:

  • 我知道动画,但交易并不顺利,因为每个片段都有很多代码要做,并且每次都会重新加载
【解决方案3】:

我使用@Adarsh Yadav 的答案和在互联网上找到的其他一些答案来制作解决我问题的函数:

public void changeFragment(Fragment fragment)
 { 
    FragmentManager fragmentManager=getSupportFragmentManager();
   FragmentTransaction fragmentTransaction=fragmentManager.beginTransaction();
     if (fragment.isAdded())
       {
           fragmentTransaction.show(fragment);

       }
       else
       {
           fragmentTransaction.add(R.id.container,fragment,fragment.getClass().getSimpleName()).addToBackStack(fragment.getClass().getSimpleName());

       }
    for (int entry=0;entry<fragmentManager.getBackStackEntryCount();entry++)
       {
           FragmentManager.BackStackEntry backStackEntry=fragmentManager.getBackStackEntryAt(entry);
           String simpleName=backStackEntry.getName();
           if (!simpleName.equals(fragment.getClass().getSimpleName())) {
               Fragment fragmentToHide = fragmentManager.findFragmentByTag(simpleName);
               fragmentTransaction.hide(fragmentToHide);
           }
       }
       fragmentTransaction.commit();
  }

【讨论】:

    【解决方案4】:

    试试这个:

    FragmentManager fragmentManager = getFragmentManager();
    fragmentManager.beginTransaction().replace(R.id.container, MyFragment).commit();
    

    当您想要更改 Activity 中的片段时,FragmentManager 很有用。

    【讨论】:

    • 我正在使用 FragmentTransaction fragmentTransaction=fragmentManager.beginTransaction();所以我在做同样的事情
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-25
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    相关资源
    最近更新 更多