Какая часть жизненного цикла 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
, onRestart
onResume
), кнопки по-прежнему отключены.
Что делать?
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();
}