2016-11-04 3 views
1

У меня есть MainActivityAndroid Фрагмент Жизненный цикл и FragmentManager.add()

@Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     setContentView(R.layout.activity_main); 

     getSupportFragmentManager() 
       .beginTransaction() 
       .add(R.id.fragment_container, AFragment.newInstance(75)) 
       .commit(); 
    } 

    @Override 
    public void onBackPressed() { 
     if (getSupportFragmentManager().getBackStackEntryCount() > 0) { 
      getSupportFragmentManager().popBackStack(); 
     } else { 
      super.onBackPressed(); 
     } 
    } 

Кроме того, у меня есть AFragment

@Nullable 
    @Override 
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 
     View view = inflater.inflate(R.layout.fragment_a, container, false); 

     view.findViewById(R.id.show_b_btn).setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       AppCompatActivity appCompatActivity = (AppCompatActivity) getActivity(); 

       appCompatActivity.getSupportFragmentManager() 
         .beginTransaction() 
         .add(R.id.fragment_container, BFragment.newInstance()) 
         .addToBackStack("B") 
         .commit(); 
      } 
     }); 

     return view; 
    } 

BFragment просто пустой фрагмент.

И у меня есть следующие фрагменты выходной жизненного цикла:

Open the App: 
A - onCreateView 
A - onStart 
A - onResume 

Click R.id.show_b_btn on AFragment: 
B - onStart 
B - onResume 

Click back button: 
B - onPause 
B - onStop 

Close the App: 
A - onPause 
A - onStop 

Таким образом, возникает вопрос, почему AFragment не вызывает OnPause, когда я нажимаю ShowBFragment и почему AFragment не вызывает onResume, когда я нажимаю кнопку назад?

Я думаю, что это происходит из-за того, что я использую .add() и BFragment, просто накладывает AFragment, поэтому AFragment также «живет», когда BFragment виден, я прав?

+0

Да, вы правы. так как вы используете использование .add() и BFragment просто накладываете AFragment, поэтому AFragment также «живет», когда BFragment виден –

+0

круто, спасибо –

ответ

1

Просто замените

getSupportFragmentManager() 
       .beginTransaction() 
       .add(R.id.fragment_container, AFragment.newInstance(75)) 
       .commit(); 

с

getSupportFragmentManager() 
       .beginTransaction() 
       .replace(R.id.fragment_container, AFragment.newInstance(75)) 
       .commit(); 

Это то, что произойдет, если вы используете FragmentTransaction.add на контейнере. Ваш добавленный фрагмент будет помещен поверх вашего существующего фрагмента. Если вы используете FragmentTransaction.replace (R.id.container, фрагмент) он будет удалять любые фрагменты, которые уже находятся в контейнере и добавить новый в том же контейнере

Вы можете также обратиться ссылке ниже

Difference between add(), replace(), and addToBackStack()

+0

Если я сделаю это, AFragment вызовет onResume и onPause. Мне это не нужно. Мне было интересно, почему AFragment не делает этого, когда я использую .add(). –

+0

Это то, что произойдет, если вы используете FragmentTransaction.add в контейнере. Ваш добавленный фрагмент будет помещен поверх вашего существующего фрагмента. Если вы используете FragmentTransaction.replace (R.id.container, фрагмент), он удалит все фрагменты, которые уже есть в контейнере, и добавьте ваш новый в тот же контейнер. –

+0

понял, спасибо –

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