当前位置: 首页 > 知识库问答 >
问题:

如何避免将相同的片段添加到堆栈

闾丘玮
2023-03-14

我需要一些帮助。em以这种方式向活动添加片段。问题是每次调用openFragment时,它都会创建片段并添加。这是显而易见的。问:我做了什么修改,所以它只能添加一次片段。在下一次使用相同的片段标记调用时,它不会执行任何操作。

案例:第一次按下按钮添加片段并显示。我再按一次同样的按钮,它没有反应。

public static void openFragment(Activity activity, Fragment fragment) {

    FragmentManager fragmentManager = ((ActionBarActivity) activity)
            .getSupportFragmentManager();
        FragmentTransaction ftx = fragmentManager.beginTransaction();
        ftx.addToBackStack(fragment.getClass().getSimpleName());
        ftx.setCustomAnimations(R.anim.slide_in_right,
                R.anim.slide_out_left, R.anim.slide_in_left,
                R.anim.slide_out_right);
        ftx.add(R.id.main_content, fragment);
        ftx.commit();
}

共有3个答案

颜楚青
2023-03-14

使用此方法检查是否已添加片段:

if(!Fragment.isAdded()){
//add fragment
}
潘向明
2023-03-14

使用FragmentTransaction.replace()代替FragmentTransaction.add()

这本质上与调用当前添加的所有片段(使用相同的containerwid添加)的remove(Fragment)相同,然后使用此处给出的相同参数添加(int,Fragment,String)。

第一次调用FragmentTransaction。replace()将简单地添加片段,因为没有要删除的片段。

郭意
2023-03-14

这是解决方案,它只允许您在堆栈中添加一次片段,否则它会从堆栈中弹出非常相同的片段。

public static void openFragment(Activity activity, Fragment fragment) {
    String fragmentTag = fragment.getClass().getName();
    FragmentManager fragmentManager= ((ActionBarActivity) activity)
            .getSupportFragmentManager();

    boolean fragmentPopped = fragmentManager
            .popBackStackImmediate(fragmentTag , 0);

    if (!fragmentPopped && fragmentManager.findFragmentByTag(fragmentTag) == null) {

    FragmentTransaction ftx = fragmentManager.beginTransaction();
    ftx.addToBackStack(fragment.getClass().getSimpleName());
    ftx.setCustomAnimations(R.anim.slide_in_right,
            R.anim.slide_out_left, R.anim.slide_in_left,
            R.anim.slide_out_right);
    ftx.add(R.id.main_content, fragment);
    ftx.commit();
  }
}

slide_in_right

<?xml version="1.0" encoding="utf-8"?>
  <set xmlns:android="http://schemas.android.com/apk/res/android"
   android:shareInterpolator="true">
  <translate android:fromXDelta="100%"
    android:toXDelta="0%" android:fromYDelta="0%"
    android:toYDelta="0%" android:duration="200">
  </translate>
</set>

滑出\u右

<?xml version="1.0" encoding="utf-8"?>
   <set xmlns:android="http://schemas.android.com/apk/res/android"
    android:shareInterpolator="false">
    <translate android:fromXDelta="0%" android:toXDelta="100%"
    android:fromYDelta="0%" android:toYDelta="0%"
    android:duration="200">
  </translate>
</set>

向左滑动\u

<?xml version="1.0" encoding="utf-8"?>
  <set xmlns:android="http://schemas.android.com/apk/res/android"
  android:shareInterpolator="true">
  <translate android:fromXDelta="-100%"
    android:toXDelta="0%" android:fromYDelta="0%"
    android:toYDelta="0%" android:duration="200">
  </translate>
</set>

滑出\u左

<?xml version="1.0" encoding="utf-8"?>
 <set xmlns:android="http://schemas.android.com/apk/res/android"
  android:shareInterpolator="true">
  <translate android:fromXDelta="0%"
    android:toXDelta="-100%" android:fromYDelta="0%"
    android:toYDelta="0%" android:duration="200">
  </translate>
</set>

这就是你如何调用这个函数:

openFragment(activity, new MyFragment());
 类似资料:
  • 我编写了一个在两个片段之间切换的虚拟活动。从FragmentA到FragmentB时,FragmentA被添加到后面的堆栈中。但是,当我返回到FragmentA时(按下back),创建了一个全新的FragmentA,并且丢失了它所处的状态。我感觉我在寻找与这个问题相同的东西,但我包含了一个完整的代码示例来帮助解决这个问题: 然而,如果在删除片段时调用addToBackStack(),则该片段将被停

  • 我想在这个导航用例中避免这种情况:A- 其中所有片段实例都保存在后栈中。原因:避免内存溢出错误。 我尝试创建一个自己的导航工作流,如下所述:https://stackoverflow.com/questions/18041583/fragments-backstack-issue?noredirect=1#comment26393904_18041583(它应该模仿活动行为,在开始一个新操作后调用

  • 我正在进行一项活动,其中有TabLayout和两个表示选项卡内容的片段。我在活动的OnCreate方法中手动管理打开选项卡的当前状态: 这只是一个简单的例子。我真正的代码是用C语言编写的,并且有一些其他逻辑来存储和管理活动重启之间的状态。 配置更改时的问题(例如开关方向): 打开的碎片被摧毁 活动被破坏 活动重启 在onCreate方法中,当调用super.onCreate(savedInstan

  • 和我的框架XML 有什么想法吗?我试图将progressBar放在WebView的“前面”,但是当页面被加载时,图标并没有消失...

  • 我正在开发一个以活动和片段为结构的简单应用程序,其中一个要求是使其可访问,因此我完成了所有内容描述、导航、焦点等。 它工作得很好,除了片段,如果有一个活动加载一个片段,对讲读取它的内容,然后用户点击一些东西,一个细节片段可以被添加到堆栈的顶部。 如果用户继续导航对讲,仍然记得丢失片段的每个元素的位置。 有没有办法清除事件的辅助功能列表并强制它再次获取它?可访问性管理器似乎没有任何方法。 - 编辑

  • 我有一个maven项目,带有插件的pluginManagement配置。我有一个单独的maven项目,不依赖于插件。Project不是Project的父项目。我有第三个项目,其父项目是使用插件P的 当我试图从项目上的plugin运行目标时,maven也尝试执行该目标项目,但失败了。 [错误]在当前项目和插件组[org.apache.maven.plugins,org.codehaus.mojo]中