android - 如何避免将相同的 fragment 添加到堆栈

标签 android android-fragments stack android-fragmentactivity fragmentmanager

我需要一些帮助。 em 以这种方式将 fragment 添加到 Activity 中。问题是在每次调用 openFragment 时它都会创建 fragment 并添加。这是显而易见的。问题:我做了什么修改,所以它只能添加一次 fragment 。在下一次使用相同 fragment 标签的调用中,它什么都不做。

案例:第一次按下按钮添加 fragment 并显示。我再次按下相同的按钮,它没有任何反应。

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();
}

最佳答案

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

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();
  }
}

向右滑入

<?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>

向右滑出

<?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>

向左滑动

<?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>

向左滑出

<?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());

关于android - 如何避免将相同的 fragment 添加到堆栈,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29144341/

相关文章:

java - Android 中线程的实现不起作用

java - 如何将 Parcelable 数组传递给 fragment 和 Activity

android-fragments - ViewPager + Fragments 开始新的 Activity

Android使用 Intent 从 Activity 中打开 fragment

java - Android fragment 页面上的 java.lang.NullPointerException

android - 错误 Cannot perform this operation because the connection pool has been closed

android - 如何确定我是否在 Android Wear 中运行?

c# - 跟踪 Visual Studio 中的错误

c - 在 c [BEGINNER] 中使用 malloc 的堆栈实现

c - 为什么将取消引用的指针推送到 Stack 输出 null 在这里?