Какая часть жизненного цикла Android задействована (если есть) при возврате через backStack к основному действию из последовательности фрагментов?

Я пытаюсь выучить Fragment учебный класс. Вот MainActivity:

    package com.dslomer64.hour8appflip;

    import android.app.Activity;
    import android.app.FragmentTransaction;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.Button;

    public class MainActivity extends Activity {

        Button btnStartGarcon, btnStartWaiter;

        @Override protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            btnStartGarcon = (Button)findViewById(R.id.btnStartGarcon);
            btnStartWaiter = (Button)findViewById(R.id.btnStartWaiter);
            ableButtons(true);
        }
        @Override protected void onStart(){
            super.onStart();
            ableButtons(true);
        }
        @Override protected void onRestart(){
            super.onRestart();
            ableButtons(true);
        }
        @Override protected void onResume(){
            super.onResume();
            ableButtons(true);
        }
        public void showFragmentGarcon(){
            FragmentGarcon fragmentGarcon = new FragmentGarcon();
            FragmentTransaction ft = getFragmentManager().beginTransaction();
            ft.replace(R.id.layout_container, fragmentGarcon);
            ft.addToBackStack("Garcon");
            ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
            ft.commit();
        }
        public void showFragmentWaiter(){
            FragmentWaiter fragmentWaiter = new FragmentWaiter();
            FragmentTransaction ft = getFragmentManager().beginTransaction();
            ft.replace(R.id.layout_container, fragmentWaiter);
            ft.addToBackStack("Waiter");
            ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
            ft.commit();
        }
        public void onStartGarcon(View view) {
            showFragmentGarcon();
            ableButtons(false);
        }
        public void onStartWaiter(View view) {
            showFragmentWaiter();
            ableButtons(false);
        }
        private void ableButtons(boolean b){
            btnStartWaiter.setEnabled(b);
            btnStartGarcon.setEnabled(b);
        }
    }

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

Но когда я нажимаю back значок достаточно раз, чтобы исчерпать backStack, что бы я ни делал (см. очень избыточно ableButtons(true) в onStart, onRestartonResume), кнопки по-прежнему отключены.

Что делать?

2 ответа

Решение

Разобрался (это никак не связано с жизненным циклом Android):

FragmentManager fm = getFragmentManager();

...

@Override
public void onBackPressed() {
    super.onBackPressed();
    if( fm.getBackStackEntryCount() == 0){
        ableButtons(true);
    }
}

И использовать fm в showFragmentGarcon и другие showFrag...:

  public void showFragmentGarcon(){
        FragmentGarcon fragmentGarcon = new FragmentGarcon();

        FragmentTransaction ft = fm.beginTransaction();
  //                             ^^

Какая часть жизненного цикла Android задействована (если есть) при возврате через backStack к основному действию из последовательности фрагментов?

Жизненный цикл Деятельности не задействован. Когда вы заменяете Фрагмент, вы не покидаете действие, поэтому вы не возвращаетесь к нему.

Но когда я нажимаю значок возврата достаточно много раз, чтобы исчерпать backStack, независимо от того, что я делаю (см. Очень избыточные ableButtons(true) в onStart, onRestart onResume), кнопки по-прежнему отключены.

Это ожидаемое поведение. Вы отключили кнопки, и вы можете включить их снова, когда backStack пустой. Например, вы можете переопределить onBackPressed

@Override
public void onBackPressed(){
  int count = getSupportFragmentManager().getBackStackEntryCount(); 

  if (count == 0){
      ableButtons(true);
  } 
    super.onBackPressed();
}
Другие вопросы по тегам