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

Moh*_*sin 7 stack android android-fragments android-fragmentactivity fragmentmanager

我需要一些帮助.以这种方式将片段添加到活动中.问题是每次调用openFragment时都会创建片段并添加.这很明显.问题:我做了什么修改,所以它只能添加片段一次.在具有相同片段标签的下一次调用中,它将无效.

case:第一次按下按钮添加片段并显示.我再次按下相同的按钮它没有任何反应.

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();
}
Run Code Online (Sandbox Code Playgroud)

Moh*_*sin 9

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

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();
  }
}
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

slide_out_right

<?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>
Run Code Online (Sandbox Code Playgroud)

slide_in_left

<?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>
Run Code Online (Sandbox Code Playgroud)

slide_out_left

<?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>
Run Code Online (Sandbox Code Playgroud)

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

openFragment(activity, new MyFragment());
Run Code Online (Sandbox Code Playgroud)


hid*_*dro 6

使用FragmentTransaction.replace()而不是FragmentTransaction.add():

这与调用remove(Fragment)所有当前添加的片段基本相同,这些片段使用相同的参数添加,containerViewId然后add(int, Fragment, String)使用相同的参数.

第一次调用FragmentTransaction.replace()将只添加片段,因为没有要删除的片段.


小智 5

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

if(!Fragment.isAdded()){
//add fragment
}
Run Code Online (Sandbox Code Playgroud)