2016-10-21 2 views
2

Я работаю над принципом единой активности. Но я столкнулся с проблемой, когда один и тот же фрагмент снова открыт, потому что он снова добавляет запись фрагмента назад. Таким образом, backstack содержит несколько записей backstack для того же фрагмента. Это создает проблему при обратной навигации.Управление экземпляром фрагмента одного экземпляра

Пример: - A | B | C | D | | C |

Так что, когда я нажимаю назад ключ же фрагмент отображает несколько раз. Есть ли способ повторно использовать существующий фрагмент из записи Backstack.

Я управляю моим backstack как это: -

fragmentManager.beginTransaction().setCustomAnimations(R.anim.fragment_enter, 
         R.anim.fragment_exit, R.anim.pop_enter, R.anim.pop_exit). 
         add(R.id.frameLayout, fragment).addToBackStack(backStateName).commit(); 

Любого вид помощи будет оценен.

ответ

0

Перед добавлением или заменой фрагмента на стопку, проверьте, если фрагмент уже находится в задней части или нет.

boolean fragmentPopped = fragmentManager.popBackStackImmediate(backStateName, 0); 
if (fragmentPopped) { 
    // fragment is popped from backStack 
} else { 
    // add or replace your fragment here  
} 
1
private void createOrResumeFragment(String fragmentTag){ 
    FragmentManager manager = getSupportFragmentManager(); 
    FragmentTransaction ft = manager.beginTransaction(); 
    boolean fragmentPopped = manager.popBackStackImmediate (fragmentTag, 0); 
    Fragment fragment = manager.findFragmentByTag(fragmentTag); 
    if(!fragmentPopped && fragment == null){ 
     //Create an new instance if it is null and add it to stack 
     fragment = new MyFragment(); 
     ft.addToBackStack(fragmentTag); 
    } 
    ft.replace(R.id.framelayout, fragment); 
    ft.commit(); 
} 
1

Попытка это с помощью списка фрагментов

See the Answer Here

Инициализировать список фрагменты

static List<String> fragments = new ArrayList<String>(); 

Пуск первого ОЛР gment на активности добавить

if (savedInstanceState == null) { 
     getSupportFragmentManager().beginTransaction().replace(R.id.frame, new AFragment()).commit(); 
     fragments.add("package.fragment.AFragment"); 
    } 

код для изменения фрагмента и принять в заднем стеке

String backStateName = fragment.getClass().getName(); 
    FragmentManager manager = getSupportFragmentManager(); 
    //fragment not in back stack, create it. 
    FragmentTransaction ft = manager.beginTransaction(); 
    if(!fragments.contains(backStateName)) { 

     // ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE); 
     // ft.setCustomAnimations(R.anim.fade_in, R.anim.fade_out); 
     ft.replace(R.id.frame, fragment); 
     ft.addToBackStack(backStateName); 
     ft.commit(); 

     fragments.add(backStateName); 
     System.out.println("backStateName" + fragments); 
    } 
    else 
    { 


     ft.replace(R.id.frame, fragment); 
     ft.commit(); 

    } 

onBackpressed

@Override 
public void onBackPressed() { 
    if(fragments.size()>0) 
     { 
      fragments.remove(fragments.size()-1); 
     } 
     super.onBackPressed(); 
} 

для снятия задней стопы

final android.app.FragmentManager fm = getFragmentManager(); 

    fm.addOnBackStackChangedListener(new android.app.FragmentManager.OnBackStackChangedListener() { 
     @Override 
     public void onBackStackChanged() { 

      if (getSupportFragmentManager().getBackStackEntryCount() ==0) { 
       // dLayout.closeDrawers(); 
       finish(); 
      } 
      else 
      { 
       // dLayout.closeDrawers(); 

      } 
     } 
    });