2014-01-21 2 views
0

шаг1: нажмите addNewFragmentBtn добавить новый фрагмент [A] и добавить его в backstackесли фрагмент не в backstack, фрагмент добавил, прежде чем он не появится снова, когда вытолкнуть стек

step2: добавить еще один фрагмент, который [B] не в backstack

step3: нажмите addNewFragmentBtn добавить новый фрагмент [C] и добавить его в backstack

Step4: нажмите назад BTN назад к предыдущему фрагменту.

Весь прогресс должен быть A->B->C-B->A, если я продолжаю нажимать кнопку «Назад» после шага 4, подсчеты записей в обратном стеке уменьшаются, но фрагмент A не является редактируемым. Как я могу прикрепить фрагмент A?

 public class Main extends FragmentActivity { 
     private int i=1; 
     private int j=1; 
     public FragmentTransaction fragmentTransaction; 

     @Override 
     protected void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.main); 
      final View addNewFragmentBtn = findViewById(R.id.add_new_fragment); 
      final View backBtn = findViewById(R.id.back); 
      final View addNewFragmentNotInStackBtn = findViewById(R.id.add_new_fragment_not_in_stack); 

      addNewFragmentBtn.setOnClickListener(
        new View.OnClickListener() { 
         @Override 
         public void onClick(View v) { 
          fragmentTransaction = getSupportFragmentManager().beginTransaction(); 
          FragmentSample fragment = new FragmentSample(); 
          Bundle args = new Bundle(); 
          args.putString("key1", "fragment1-" + i + "is in backstack"); 
          fragment.setArguments(args); 
          fragmentTransaction.add(R.id.content, fragment); 
          fragmentTransaction.addToBackStack(null); 
          fragmentTransaction.commit(); 
          i++; 
         } 
        } 
      ); 
      addNewFragmentNotInStackBtn.setOnClickListener(
        new View.OnClickListener() { 
         @Override 
         public void onClick(View v) { 
          fragmentTransaction = getSupportFragmentManager().beginTransaction(); 
          FragmentSample fragment = new FragmentSample(); 
          Bundle args = new Bundle(); 
          args.putString("key2", "fragment2-" + j + " is not in backstack"); 
          fragment.setArguments(args); 
          fragmentTransaction.add(R.id.content, fragment); 
    //      fragmentTransaction.addToBackStack(null); 
          fragmentTransaction.commit(); 
          j++; 
         } 
        } 
      ); 
      backBtn.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        int backStackEntryCount = getSupportFragmentManager().getBackStackEntryCount(); 
        if (backStackEntryCount > 0) { 
         getSupportFragmentManager().popBackStack(); 
        } else finish(); 
       } 
      }); 

     } 
    } 
+0

Попробуйте добавлять фрагменты с помощью 'ft.replace()' вместо 'ft.add()'. – owe

+0

@owe Я хочу возобновить первый фрагмент A, когда пользователь нажимает кнопку «Назад», пропускает B, поэтому B не должен заменять A – log1000

+0

, это будет автоматически обработано вашей задней стороной. Если вы добавите FragA и FragB, а затем щелкните по кнопке -> FragA. Но необходимо добавить каждый фрагмент к вашему столу с помощью 'ft.addToBackStack()'. – owe

ответ

0

вот мой обходной путь: классифицировать их с тегами: вид фрагмента, который вы хотите поместить в стек обратно дать им тег «A_STACK», другие, которые вы не хотите, чтобы возобновить, добавить тег «B_STACK».

в методе BackBtn.onClick:

public class Main extends FragmentActivity { 
     private int i = 1; 
     private int j = 1; 
     public FragmentTransaction fragmentTransaction; 
     private final static String NO_HISTORY_FRAGMENT = "NO_HISTORY_FRAGMENT"; 
     private final static String KEEP_HISTORY_FRAGMENT = "KEEP_HISTORY_FRAGMENT"; 
     public String KEEP_HISTORY_FRAGMENT_STACK = "KEEP_HISTORY_FRAGMENT_STACK"; 
     public String NO_HISTORY_FRAGMENT_STACK = "NO_HISTORY_FRAGMENT_STACK"; 

     @Override 
     protected void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.main); 


      final View addNewFragmentBtn = findViewById(R.id.add_new_fragment); 
      final View backBtn = findViewById(R.id.back); 
      final View addNewFragmentNotInStackBtn = findViewById(R.id.add_new_fragment_not_in_stack); 

      addNewFragmentBtn.setOnClickListener(
        new View.OnClickListener() { 
         @Override 
         public void onClick(View v) { 
          fragmentTransaction = getSupportFragmentManager().beginTransaction(); 


          FragmentSample fragment = new FragmentSample(); 
          Bundle args = new Bundle(); 
          args.putString("key1", "fragment1-" + i + "is in backstack"); 
          fragment.setArguments(args); 
          fragmentTransaction.add(R.id.content, fragment, KEEP_HISTORY_FRAGMENT); 
          fragmentTransaction.addToBackStack(KEEP_HISTORY_FRAGMENT_STACK); 
          fragmentTransaction.commit(); 
          i++; 
         } 
        } 
      ); 
      addNewFragmentNotInStackBtn.setOnClickListener(
        new View.OnClickListener() { 
         @Override 
         public void onClick(View v) { 
          fragmentTransaction = getSupportFragmentManager().beginTransaction(); 
          FragmentSample fragment = new FragmentSample(); 
          Bundle args = new Bundle(); 
          args.putString("key2", "fragment2-" + j + " is not in backstack"); 
          fragment.setArguments(args); 
          fragmentTransaction.add(R.id.content, fragment, NO_HISTORY_FRAGMENT); 
          fragmentTransaction.addToBackStack(NO_HISTORY_FRAGMENT_STACK); 
          fragmentTransaction.commit(); 
          j++; 
         } 
        } 
      ); 
      backBtn.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        int backStackEntryCount = getSupportFragmentManager().getBackStackEntryCount(); 
        if(backStackEntryCount>0){ 
         FragmentSample currentFragment = (FragmentSample) getSupportFragmentManager().findFragmentByTag(NO_HISTORY_FRAGMENT); 
         if(currentFragment!=null){ 
          getSupportFragmentManager().popBackStack(NO_HISTORY_FRAGMENT_STACK, 1);//clear the not necessary fragment stack 
          getSupportFragmentManager().popBackStack(KEEP_HISTORY_FRAGMENT_STACK, 0);//switch to the usefull stack 
         }else { 
          getSupportFragmentManager().popBackStack(); 
         } 
        }else finish(); 
       } 
      }); 

     } 
    } 
Смежные вопросы