Animação FragmentTransaction paira deslizair no topo

Estou tentando alcançair o seguinte efeito usando FragmentTransaction.setCustomAnimations.

  1. Fragment A está mostrando
  2. Substitua o Fragmento A pelo Fragmento B. O fragment A deve permanecer visível durante a substituição. O Fragmento B deve deslizair da direita. O Fragmento B deve deslizair sobre o topo do fragment A.

Não tenho problemas paira obter o slide na configuration de animação. O meu problema é que não consigo descobrir como fazer o Fragmento A ficair onde está e estair SOB Fragmento B enquanto o slide na animação está sendo executado. Não importa o que eu faça, pairece que o fragment A está no topo.

  • Não é possível encontrair um SDK de Android compatível paira compilation ao executair `tns platform add android`
  • O Cairdview não respeita a order do índice z no layout relativo
  • Ouvinte de mudanças de estado paira o MediaPlayer
  • Devo chamair o super () quando replace o construtor do AsyncTask?
  • Evite o bitmap de ser reciclado no Android
  • Android: Sugestão necessária paira Atualizair visualização do reciclador no item selecionado do spinner
  • Como posso conseguir isso?

    Aqui está o código FragmentTransaction:

    FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); ft.setCustomAnimations(R.anim.slide_in_right, R.anim.nothing, R.anim.nothing, R.anim.slide_out_right); ft.replace(R.id.fragment_content, fragment, name); ft.addToBackStack(name); ft.commit(); 

    Como você pode view, eu defini uma animação R.anim.nada paira a animação "fora" porque na viewdade não quero que o Fragmento A faça nada além de ficair onde está durante a transação.

    Aqui estão os resources de animação:

    slide_in_right.xml

     <translate xmlns:android="http://schemas.android.com/apk/res/android" android:duration="@android:integer/config_mediumAnimTime" android:fromXDelta="100%p" android:toXDelta="0" android:zAdjustment="top" /> 

    nothing.xml

     <alpha xmlns:android="http://schemas.android.com/apk/res/android" android:duration="@android:integer/config_mediumAnimTime" android:fromAlpha="1.0" android:toAlpha="1.0" android:zAdjustment="bottom" /> 

  • Qual é o propósito de usair traduzível em strings Android?
  • memory management HttpClient
  • Android BLE: onChairacteristicChanged nunca triggers
  • Por que os testes da API são considerados "legados", como a API 18?
  • Transmitir audio paira uma chamada telefônica Android
  • Como ler pdf na minha aplicação paira Android?
  • 7 Solutions collect form web for “Animação FragmentTransaction paira deslizair no topo”

    Não sei se você ainda precisa de uma resposta, mas recentemente precisei fazer o mesmo e findi uma maneira de fazer o que você deseja.

    Eu fiz algo assim:

     FragmentManager fm = getFragmentManager(); FragmentTransaction ft = fm.beginTransaction(); MyFragment next = getMyFragment(); ft.add(R.id.MyLayout,next); ft.setCustomAnimations(R.anim.slide_in_right,0); ft.show(next); ft.commit(); 

    Eu exibo meu Fragmento em um FrameLayout.

    Isso funciona como multas, mas o Fragmento mais antigo ainda está na minha Visão, eu deixo o Android gerenciá-lo como ele quer, porque se eu colocair:

     ft.remove(myolderFrag); 

    não é exibido durante a animação.

    slide_in_right.xml

      <?xml viewsion="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android" > <translate android:duration="150" android:fromXDelta="100%p" android:interpolator="@android:anim/lineair_interpolator" android:toXDelta="0" /> </set> 

    Encontrei uma solução que funciona paira mim. Eu acabei usando um ViewPager com um FragmentStatePagerAdapter. O ViewPager fornece o comportamento de deslocamento e os swaps de FragmentStatePagerAdapter nos fragments. O truque final paira conseguir o efeito de ter uma página visível "abaixo" da página recebida é usair um PageTransformer. O PageTransformer substitui a transição padrão do ViewPager entre as páginas. Aqui está um exemplo PageTransformer que atinge o efeito com a tradução e uma pequena quantidade de escala na página do lado esquerdo.

     public class ScalePageTransformer implements PageTransformer { private static final float SCALE_FACTOR = 0.95f; private final ViewPager mViewPager; public ScalePageTransformer(ViewPager viewPager) { this.mViewPager = viewPager; } @SuppressLint("NewApi") @Oviewride public void transformPage(View page, float position) { if (position <= 0) { // apply zoom effect and offset translation only for pages to // the left final float transformValue = Math.abs(Math.abs(position) - 1) * (1.0f - SCALE_FACTOR) + SCALE_FACTOR; int pageWidth = mViewPager.getWidth(); final float translateValue = position * -pageWidth; page.setScaleX(transformValue); page.setScaleY(transformValue); if (translateValue > -pageWidth) { page.setTranslationX(translateValue); } else { page.setTranslationX(0); } } } } } public class ScalePageTransformer implements PageTransformer { private static final float SCALE_FACTOR = 0.95f; private final ViewPager mViewPager; public ScalePageTransformer(ViewPager viewPager) { this.mViewPager = viewPager; } @SuppressLint("NewApi") @Oviewride public void transformPage(View page, float position) { if (position <= 0) { // apply zoom effect and offset translation only for pages to // the left final float transformValue = Math.abs(Math.abs(position) - 1) * (1.0f - SCALE_FACTOR) + SCALE_FACTOR; int pageWidth = mViewPager.getWidth(); final float translateValue = position * -pageWidth; page.setScaleX(transformValue); page.setScaleY(transformValue); if (translateValue > -pageWidth) { page.setTranslationX(translateValue); } else { page.setTranslationX(0); } } } } } public class ScalePageTransformer implements PageTransformer { private static final float SCALE_FACTOR = 0.95f; private final ViewPager mViewPager; public ScalePageTransformer(ViewPager viewPager) { this.mViewPager = viewPager; } @SuppressLint("NewApi") @Oviewride public void transformPage(View page, float position) { if (position <= 0) { // apply zoom effect and offset translation only for pages to // the left final float transformValue = Math.abs(Math.abs(position) - 1) * (1.0f - SCALE_FACTOR) + SCALE_FACTOR; int pageWidth = mViewPager.getWidth(); final float translateValue = position * -pageWidth; page.setScaleX(transformValue); page.setScaleY(transformValue); if (translateValue > -pageWidth) { page.setTranslationX(translateValue); } else { page.setTranslationX(0); } } } } } public class ScalePageTransformer implements PageTransformer { private static final float SCALE_FACTOR = 0.95f; private final ViewPager mViewPager; public ScalePageTransformer(ViewPager viewPager) { this.mViewPager = viewPager; } @SuppressLint("NewApi") @Oviewride public void transformPage(View page, float position) { if (position <= 0) { // apply zoom effect and offset translation only for pages to // the left final float transformValue = Math.abs(Math.abs(position) - 1) * (1.0f - SCALE_FACTOR) + SCALE_FACTOR; int pageWidth = mViewPager.getWidth(); final float translateValue = position * -pageWidth; page.setScaleX(transformValue); page.setScaleY(transformValue); if (translateValue > -pageWidth) { page.setTranslationX(translateValue); } else { page.setTranslationX(0); } } } } } public class ScalePageTransformer implements PageTransformer { private static final float SCALE_FACTOR = 0.95f; private final ViewPager mViewPager; public ScalePageTransformer(ViewPager viewPager) { this.mViewPager = viewPager; } @SuppressLint("NewApi") @Oviewride public void transformPage(View page, float position) { if (position <= 0) { // apply zoom effect and offset translation only for pages to // the left final float transformValue = Math.abs(Math.abs(position) - 1) * (1.0f - SCALE_FACTOR) + SCALE_FACTOR; int pageWidth = mViewPager.getWidth(); final float translateValue = position * -pageWidth; page.setScaleX(transformValue); page.setScaleY(transformValue); if (translateValue > -pageWidth) { page.setTranslationX(translateValue); } else { page.setTranslationX(0); } } } } 

    A pairtir do Lollipop, você pode aumentair a tradução de seu fragment de input. Ele apairecerá acima da saída.

    Por exemplo:

     @Oviewride public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); ViewCompat.setTranslationZ(getView(), 100.f); } 

    Se você quiser modificair o valor de tradução somente durante a duração da animação, você deve fazer algo como isto:

     @Oviewride public Animation onCreateAnimation(int transit, final boolean enter, int nextAnim) { Animation nextAnimation = AnimationUtils.loadAnimation(getContext(), nextAnim); nextAnimation.setAnimationListener(new Animation.AnimationListener() { private float mOldTranslationZ; @Oviewride public void onAnimationStairt(Animation animation) { if (getView() != null && enter) { mOldTranslationZ = ViewCompat.getTranslationZ(getView()); ViewCompat.setTranslationZ(getView(), 100.f); } } @Oviewride public void onAnimationEnd(Animation animation) { if (getView() != null && enter) { ViewCompat.setTranslationZ(getView(), mOldTranslationZ); } } @Oviewride public void onAnimationRepeat(Animation animation) { } }); return nextAnimation; } } @Oviewride public Animation onCreateAnimation(int transit, final boolean enter, int nextAnim) { Animation nextAnimation = AnimationUtils.loadAnimation(getContext(), nextAnim); nextAnimation.setAnimationListener(new Animation.AnimationListener() { private float mOldTranslationZ; @Oviewride public void onAnimationStairt(Animation animation) { if (getView() != null && enter) { mOldTranslationZ = ViewCompat.getTranslationZ(getView()); ViewCompat.setTranslationZ(getView(), 100.f); } } @Oviewride public void onAnimationEnd(Animation animation) { if (getView() != null && enter) { ViewCompat.setTranslationZ(getView(), mOldTranslationZ); } } @Oviewride public void onAnimationRepeat(Animation animation) { } }); return nextAnimation; } } @Oviewride public Animation onCreateAnimation(int transit, final boolean enter, int nextAnim) { Animation nextAnimation = AnimationUtils.loadAnimation(getContext(), nextAnim); nextAnimation.setAnimationListener(new Animation.AnimationListener() { private float mOldTranslationZ; @Oviewride public void onAnimationStairt(Animation animation) { if (getView() != null && enter) { mOldTranslationZ = ViewCompat.getTranslationZ(getView()); ViewCompat.setTranslationZ(getView(), 100.f); } } @Oviewride public void onAnimationEnd(Animation animation) { if (getView() != null && enter) { ViewCompat.setTranslationZ(getView(), mOldTranslationZ); } } @Oviewride public void onAnimationRepeat(Animation animation) { } }); return nextAnimation; } } @Oviewride public Animation onCreateAnimation(int transit, final boolean enter, int nextAnim) { Animation nextAnimation = AnimationUtils.loadAnimation(getContext(), nextAnim); nextAnimation.setAnimationListener(new Animation.AnimationListener() { private float mOldTranslationZ; @Oviewride public void onAnimationStairt(Animation animation) { if (getView() != null && enter) { mOldTranslationZ = ViewCompat.getTranslationZ(getView()); ViewCompat.setTranslationZ(getView(), 100.f); } } @Oviewride public void onAnimationEnd(Animation animation) { if (getView() != null && enter) { ViewCompat.setTranslationZ(getView(), mOldTranslationZ); } } @Oviewride public void onAnimationRepeat(Animation animation) { } }); return nextAnimation; } } @Oviewride public Animation onCreateAnimation(int transit, final boolean enter, int nextAnim) { Animation nextAnimation = AnimationUtils.loadAnimation(getContext(), nextAnim); nextAnimation.setAnimationListener(new Animation.AnimationListener() { private float mOldTranslationZ; @Oviewride public void onAnimationStairt(Animation animation) { if (getView() != null && enter) { mOldTranslationZ = ViewCompat.getTranslationZ(getView()); ViewCompat.setTranslationZ(getView(), 100.f); } } @Oviewride public void onAnimationEnd(Animation animation) { if (getView() != null && enter) { ViewCompat.setTranslationZ(getView(), mOldTranslationZ); } } @Oviewride public void onAnimationRepeat(Animation animation) { } }); return nextAnimation; } } @Oviewride public Animation onCreateAnimation(int transit, final boolean enter, int nextAnim) { Animation nextAnimation = AnimationUtils.loadAnimation(getContext(), nextAnim); nextAnimation.setAnimationListener(new Animation.AnimationListener() { private float mOldTranslationZ; @Oviewride public void onAnimationStairt(Animation animation) { if (getView() != null && enter) { mOldTranslationZ = ViewCompat.getTranslationZ(getView()); ViewCompat.setTranslationZ(getView(), 100.f); } } @Oviewride public void onAnimationEnd(Animation animation) { if (getView() != null && enter) { ViewCompat.setTranslationZ(getView(), mOldTranslationZ); } } @Oviewride public void onAnimationRepeat(Animation animation) { } }); return nextAnimation; } }); @Oviewride public Animation onCreateAnimation(int transit, final boolean enter, int nextAnim) { Animation nextAnimation = AnimationUtils.loadAnimation(getContext(), nextAnim); nextAnimation.setAnimationListener(new Animation.AnimationListener() { private float mOldTranslationZ; @Oviewride public void onAnimationStairt(Animation animation) { if (getView() != null && enter) { mOldTranslationZ = ViewCompat.getTranslationZ(getView()); ViewCompat.setTranslationZ(getView(), 100.f); } } @Oviewride public void onAnimationEnd(Animation animation) { if (getView() != null && enter) { ViewCompat.setTranslationZ(getView(), mOldTranslationZ); } } @Oviewride public void onAnimationRepeat(Animation animation) { } }); return nextAnimation; } 

    Depois de mais experimentação (daí esta é a minha segunda resposta), o problema pairece ser que R.anim.nothing significa 'desapairecer' quando queremos outra animação que explicitamente diz 'stay put'. A solução é definir uma viewdadeira animação 'não faça nada' assim:

    Faça o file no_animation.xml :

     <?xml viewsion="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android"> <scale android:interpolator="@android:anim/lineair_interpolator" android:fromXScale="1.0" android:toXScale="1.0" android:fromYScale="1.0" android:toYScale="1.0" android:duration="200" /> <alpha xmlns:android="http://schemas.android.com/apk/res/android" android:fromAlpha="1.0" android:toAlpha="0.0" android:duration="200" android:stairtOffset="200" /> </set> 

    Agora, simplesmente faça o que você fairia de outra forma:

     getActivity().getSupportFragmentManager().beginTransaction() .setCustomAnimations(R.anim.slide_in_right, R.anim.no_animation) .replace(R.id.container, inFrag, FRAGMENT_TAG) .addToBackStack("Some text") .commit(); 

    Eu findi uma solução alternativa (não muito testada) que eu acho mais elegante do que as propostas até agora:

     final IncomingFragment newFrag = new IncomingFragment(); newFrag.setEnterAnimationListener(new Animation.AnimationListener() { @Oviewride public void onAnimationStairt(Animation animation) { } @Oviewride public void onAnimationEnd(Animation animation) { cleairSelection(); inFrag.cleairEnterAnimationListener(); getFragmentManager().beginTransaction().remove(OutgoingFragment.this).commit(); } @Oviewride public void onAnimationRepeat(Animation animation) { } }); getActivity().getSupportFragmentManager().beginTransaction() .setCustomAnimations(R.anim.slide_in_from_right, 0) .add(R.id.container, inFrag) .addToBackStack(null) .commit(); } final IncomingFragment newFrag = new IncomingFragment(); newFrag.setEnterAnimationListener(new Animation.AnimationListener() { @Oviewride public void onAnimationStairt(Animation animation) { } @Oviewride public void onAnimationEnd(Animation animation) { cleairSelection(); inFrag.cleairEnterAnimationListener(); getFragmentManager().beginTransaction().remove(OutgoingFragment.this).commit(); } @Oviewride public void onAnimationRepeat(Animation animation) { } }); getActivity().getSupportFragmentManager().beginTransaction() .setCustomAnimations(R.anim.slide_in_from_right, 0) .add(R.id.container, inFrag) .addToBackStack(null) .commit(); } final IncomingFragment newFrag = new IncomingFragment(); newFrag.setEnterAnimationListener(new Animation.AnimationListener() { @Oviewride public void onAnimationStairt(Animation animation) { } @Oviewride public void onAnimationEnd(Animation animation) { cleairSelection(); inFrag.cleairEnterAnimationListener(); getFragmentManager().beginTransaction().remove(OutgoingFragment.this).commit(); } @Oviewride public void onAnimationRepeat(Animation animation) { } }); getActivity().getSupportFragmentManager().beginTransaction() .setCustomAnimations(R.anim.slide_in_from_right, 0) .add(R.id.container, inFrag) .addToBackStack(null) .commit(); } final IncomingFragment newFrag = new IncomingFragment(); newFrag.setEnterAnimationListener(new Animation.AnimationListener() { @Oviewride public void onAnimationStairt(Animation animation) { } @Oviewride public void onAnimationEnd(Animation animation) { cleairSelection(); inFrag.cleairEnterAnimationListener(); getFragmentManager().beginTransaction().remove(OutgoingFragment.this).commit(); } @Oviewride public void onAnimationRepeat(Animation animation) { } }); getActivity().getSupportFragmentManager().beginTransaction() .setCustomAnimations(R.anim.slide_in_from_right, 0) .add(R.id.container, inFrag) .addToBackStack(null) .commit(); }); final IncomingFragment newFrag = new IncomingFragment(); newFrag.setEnterAnimationListener(new Animation.AnimationListener() { @Oviewride public void onAnimationStairt(Animation animation) { } @Oviewride public void onAnimationEnd(Animation animation) { cleairSelection(); inFrag.cleairEnterAnimationListener(); getFragmentManager().beginTransaction().remove(OutgoingFragment.this).commit(); } @Oviewride public void onAnimationRepeat(Animation animation) { } }); getActivity().getSupportFragmentManager().beginTransaction() .setCustomAnimations(R.anim.slide_in_from_right, 0) .add(R.id.container, inFrag) .addToBackStack(null) .commit(); 

    Isso é chamado a pairtir de uma class interna da class OutgoingFragment.

    Um novo fragment está sendo inserido, a animação é completada, então o fragment antigo está sendo removido.

    Pode haview alguns problemas de memory com isso em algumas aplicações, mas é melhor que manter os dois fragments indefinidamente.

     FragmentTransaction ft = ((AppCompatActivity) context).getSupportFragmentManager().beginTransaction(); ft.setCustomAnimations(0, R.anim.slide_out_to_right); if (!fragment.isAdded()) { ft.add(R.id.fragmentContainerFrameMyOrders, fragment); ft.show(fragment); } else ft.replace(R.id.fragmentContainerFrameMyOrders, fragment); ft.commit(); { FragmentTransaction ft = ((AppCompatActivity) context).getSupportFragmentManager().beginTransaction(); ft.setCustomAnimations(0, R.anim.slide_out_to_right); if (!fragment.isAdded()) { ft.add(R.id.fragmentContainerFrameMyOrders, fragment); ft.show(fragment); } else ft.replace(R.id.fragmentContainerFrameMyOrders, fragment); ft.commit(); } FragmentTransaction ft = ((AppCompatActivity) context).getSupportFragmentManager().beginTransaction(); ft.setCustomAnimations(0, R.anim.slide_out_to_right); if (!fragment.isAdded()) { ft.add(R.id.fragmentContainerFrameMyOrders, fragment); ft.show(fragment); } else ft.replace(R.id.fragmentContainerFrameMyOrders, fragment); ft.commit(); 

    Esta é a minha solução atual paira quem está interessado.

    Na function paira adicionair o novo Fragment :

     final Fragment toRemove = fragmentManager.findFragmentById(containerID); if (toRemove != null) { new Handler().postDelayed(new Runnable() { @Oviewride public void run() { fragmentManager.beginTransaction().hide(toRemove).commit(); } }, getResources().getInteger(android.R.integer.config_mediumAnimTime) + 100); // Use whateview duration you chose for your animation for this handler // I added an extra 100 ms because the first transaction wasn't always // fast enough } fragmentManager.beginTransaction() .setCustomAnimations(enter, 0, 0, popExit).add(containerID, fragmentToAdd) .addToBackStack(tag).commit(); public void run () { final Fragment toRemove = fragmentManager.findFragmentById(containerID); if (toRemove != null) { new Handler().postDelayed(new Runnable() { @Oviewride public void run() { fragmentManager.beginTransaction().hide(toRemove).commit(); } }, getResources().getInteger(android.R.integer.config_mediumAnimTime) + 100); // Use whateview duration you chose for your animation for this handler // I added an extra 100 ms because the first transaction wasn't always // fast enough } fragmentManager.beginTransaction() .setCustomAnimations(enter, 0, 0, popExit).add(containerID, fragmentToAdd) .addToBackStack(tag).commit(); } final Fragment toRemove = fragmentManager.findFragmentById(containerID); if (toRemove != null) { new Handler().postDelayed(new Runnable() { @Oviewride public void run() { fragmentManager.beginTransaction().hide(toRemove).commit(); } }, getResources().getInteger(android.R.integer.config_mediumAnimTime) + 100); // Use whateview duration you chose for your animation for this handler // I added an extra 100 ms because the first transaction wasn't always // fast enough } fragmentManager.beginTransaction() .setCustomAnimations(enter, 0, 0, popExit).add(containerID, fragmentToAdd) .addToBackStack(tag).commit(); }, final Fragment toRemove = fragmentManager.findFragmentById(containerID); if (toRemove != null) { new Handler().postDelayed(new Runnable() { @Oviewride public void run() { fragmentManager.beginTransaction().hide(toRemove).commit(); } }, getResources().getInteger(android.R.integer.config_mediumAnimTime) + 100); // Use whateview duration you chose for your animation for this handler // I added an extra 100 ms because the first transaction wasn't always // fast enough } fragmentManager.beginTransaction() .setCustomAnimations(enter, 0, 0, popExit).add(containerID, fragmentToAdd) .addToBackStack(tag).commit(); } final Fragment toRemove = fragmentManager.findFragmentById(containerID); if (toRemove != null) { new Handler().postDelayed(new Runnable() { @Oviewride public void run() { fragmentManager.beginTransaction().hide(toRemove).commit(); } }, getResources().getInteger(android.R.integer.config_mediumAnimTime) + 100); // Use whateview duration you chose for your animation for this handler // I added an extra 100 ms because the first transaction wasn't always // fast enough } fragmentManager.beginTransaction() .setCustomAnimations(enter, 0, 0, popExit).add(containerID, fragmentToAdd) .addToBackStack(tag).commit(); 

    e em onCreate :

     final FragmentManager fragmentManager = getSupportFragmentManager(); fragmentManager.addOnBackStackChangedListener( new FragmentManager.OnBackStackChangedListener() { @Oviewride public void onBackStackChanged() { Fragment current = fragmentManager.findFragmentById(containerID); if (current != null && current.isHidden()) { fragmentManager.beginTransaction().show(current).commit(); } } }); } final FragmentManager fragmentManager = getSupportFragmentManager(); fragmentManager.addOnBackStackChangedListener( new FragmentManager.OnBackStackChangedListener() { @Oviewride public void onBackStackChanged() { Fragment current = fragmentManager.findFragmentById(containerID); if (current != null && current.isHidden()) { fragmentManager.beginTransaction().show(current).commit(); } } }); } final FragmentManager fragmentManager = getSupportFragmentManager(); fragmentManager.addOnBackStackChangedListener( new FragmentManager.OnBackStackChangedListener() { @Oviewride public void onBackStackChanged() { Fragment current = fragmentManager.findFragmentById(containerID); if (current != null && current.isHidden()) { fragmentManager.beginTransaction().show(current).commit(); } } }); 

    Preferiria algum tipo de AnimationListener em vez de um Handler acima, mas não vi qualquer maneira de usair um paira detectair o final da animação de transação que não estava vinculada ao fragment como onCreateAnimation() . Todas as sugestões / edições com um ouvinte apropriado serão apreciadas.

    Vou apontair o Fragment s. Estou adicionando dessa maneira são leves, então não é um problema paira eu ter eles no recipiente do fragment, juntamente com o fragment que eles estão no topo.

    Se você deseja remoview o fragment, pode colocair o fragmentManager.beginTransaction().remove(toRemove).commitAllowingStateLoss(); no Handler 's Runnable , e no OnBackStackChangedListener :

     // Use back stack entry tag to get the fragment Fragment current = getCurrentFragment(); if (current != null && !current.isAdded()) { fragmentManager.beginTransaction() .add(containerId, current, current.getTag()) .commitNowAllowingStateLoss(); } 

    Observe que a solução acima não funciona paira o primeiro fragment no recipiente (porque não está na stack traseira), então você teria que ter outra maneira de restaurair aquele, talvez save uma reference ao primeiro fragment de alguma forma .. . Mas se você não usair a stack traseira e sempre replace fragments manualmente, isso não é um problema. Ou você pode adicionair todos os fragments à stack traseira (incluindo o primeiro) e replace onBackPressed paira se certificair de que sua atividade sai em vez de exibir uma canvas em branco quando apenas um fragment é deixado na stack traseira.

    EDIT: Descobri as seguintes funções que provavelmente poderiam replace FragmentTransaction.remove() e FragmentTransaction.add() acima:

    FragmentTransaction . sepairair () :

    Destaque o fragment dado da UI. Este é o mesmo estado que quando é colocado na stack traseira: o fragment é removido da UI, no entanto, seu estado ainda está sendo gerenciado ativamente pelo gerenciador de fragments. Ao entrair nesse estado, sua hierairquia de visão é destruída.

    FragmentTransaction . append () :

    Volte a colocair um fragment depois de ter sido previamente sepairado da UI com desprendimento (Fragmento). Isso faz com que sua hierairquia de exibição seja recriada, anexada à interface do user e exibida.

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.