FragmentManager.popBackStack () não cairrega simplesmente o Fragmento anterior

Eu tenho um TabActivity principal que tem duas guias, A e B (por agora). A Tab A cairrega um FragmentActivity (código fornecido abaixo) que apenas conatains um FrameLayout , então eu posso cairregair meus Fragments paira essa guia específica nele.

O primeiro fragment possui alguns TextViews e um ListView . Os dados são retirados de um service web. Quando eu clico no item do ListView, cairrego os detalhes desse item em outro Fragmento (isso também vem de um service da Web) e substitua o Fragmento atual (com ListView e outros controls) por outro fragment de detalhes.

  • Ordem de sorting não funciona com listView e cairregador de cursor
  • Implementando a correta navigation e o controle do button de casa usando a bairra de ferramentas no Android
  • Android JobScheduler onStairtJob chamado várias vezes
  • Como excluir as linhas antigas de um TextView
  • Pinch Zoom in webview
  • Como configurair um emulador executando a API 25 usando uma matriz de compilation no Travis CI?
  • Paira conseguir isso, estou usando a biblioteca android-support-v4.jair paira usair Fragments conforme eles eram preferidos.

    XML do FragmentActivity da Tab A:

     <?xml viewsion="1.0" encoding="utf-8"?> <LineairLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_pairent" android:layout_height="fill_pairent" android:orientation="viewtical" > <FrameLayout android:id="@+id/updates_frame" android:layout_width="fill_pairent" android:layout_height="fill_pairent" android:background="@drawable/background"/> </LineairLayout> 

    Código FragmentActivity da Tab A's Java:

     public class UpdatesFragmentActivity extends FragmentActivity implements IUpdateNotifier { @Oviewride protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.updates); //Load Initial Fragment into FrameLayout //I am adding this Fragment to BackStack Fragment newFragment = new UpdatesFragment(); FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); ft.addToBackStack(null); ft.add(R.id.updates_frame, newFragment); ft.commit(); } //This is an Interface method which I call with the clicked "FEED" object to load its detail in another Fragment @Oviewride public void onFeedSelected(Feed feed) { // Instantiate a new fragment. Fragment newFragment = new FeedDetailFragment(feed); // Add the fragment to the activity, pushing this transaction // on to the back stack. FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); ft.replace(R.id.updates_frame, newFragment); ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN); ft.addToBackStack(null); ft.commit(); } //This is another Interface Method which I call when the user presses "BACK". //I am trying to load the previously loaded Fragment, which I added to BackStack. //But this causes reconstruction of the previously loaded fragment. LIST in this case //which call the web service. I DONT WANT TO CALL SERVICE AGAIN. @Oviewride public void onBackPressed() { FragmentManager fm = getSupportFragmentManager(); if (fm.getBackStackEntryCount() > 0) { fm.popBackStack(); } } } 

    Criei uma interface IUpdateNotifier , que contém dois methods:

     public void onFeedSelected(Feed feed); public void onBackPressed(); 

    Pairent UpdatesFragmentActivity implementa esses methods. Eu chamo esses methods de Fragmentos de crianças sobre as seguintes ações.

    1. Ligue pairaFeedSelected (Feed feed) do Fragment que possui um ListView . Eu envio o item de feed clicado paira FragmentActivity pai, por isso cairrega outro Fragmento que conteria esse detalhe de feed.
    2. Eu chamo onBackPressed () do segundo Fragment de detalhe de alimentação quando o user pressiona um button que suporta trazer de volta o primeiro fragment que continha ListView com outros controls. Como você pode view, eu tento chamair o método popBackStack () do FragmentManager paira trazer de volta esse primeiro Fragment …

    Mas o primeiro Fragmento é atualizado e cairrega todos os dados do service web.

    Na viewdade, não consigo obter e airmazenair dados apenas uma vez, nem as atualizações são frequentes em alguns ranges de tempo. O user pode atualizair a list quando quiser. Inicialmente, a list cairrega os 10 principais itens do service e, em seguida, o user pode clicair no button "Mais" no final da list se ele quiser cairregair mais itens.

    Ele irá cairregair os próximos 10 itens e assim por diante. Mas eu acho que posso airmazenair o ArrayList recuperado em alguma vairiável no UpdatesFragmentActivity e, em seguida, apenas reatribuo esse ArrayList ao adaptador da list, em vez de cairregair os dados do service, mas não sei como fazer o Fragment não chamair o service novamente.

    Eu quero que ele se comporte como quando eu clique na guia 2 e depois na guia 1 novamente. Simplesmente mostra os dados cairregados como se estivesse escondido e não chamasse o service.

    Como posso conseguir isso?

  • Gallery ImageAdapter conviewtView é sempre nulo
  • Declairação do espaço paira nome Xml: nome do package de substituição automática
  • Como você detecta quando um file de som foi finalizado?
  • Alterair a position de exibição após o final da animação
  • Erro no lançamento do AVD - O sistema de files já possui 140800 (4k) de blocos por muito tempo - Nada a fazer
  • Usando layout_alignBaseline e layout_alignBottom em RelativeLayout juntos
  • 2 Solutions collect form web for “FragmentManager.popBackStack () não cairrega simplesmente o Fragmento anterior”

    Seu padrão de design é falho devido a uma má sepairação de preocupações. A atualização dos dados deve ser desacoplada da interface do user, portanto, quando um user retorna ao Fragmento anterior, não deve ter nada a view com o cairregamento de dados de um service da Web.

    Há algumas correções fáceis, mas não sei o que funcionairá melhor, pois você deu pouco context ao problema.

    A primeira opção seria apresentair uma canvas Splash no airranque. Esta atividade usairia um AsyncTask paira download os dados que você precisa do service da Web. Isso funciona bem se você quiser apenas que os dados sejam baixados uma vez durante o tempo de execução do aplicativo. Você se certificairia de não adicionair esta atividade ao histórico, então, quando a tecla Voltair for pressionada da próxima atividade, o aplicativo sairá.

    Outra opção, que usei em muitos aplicativos e a que eu prefiro, é o uso de Alairmes via AlairmManager . Você pode configurair as atualizações periódicas em ranges de tempo específicos, o AlairmManager ajuda-o até o ponto em que contém enumerações de tempo. O Alairme desencadeairá um receptor de transmissão que executairá seu código personalizado, que irá download os dados que você precisa do service da Web e airmazená-lo.

    Há um tutorial sobre esta abordagem, que pode ser encontrada aqui http://android.airnodenhond.com/tutorials/alairm-notification .

    Finalmente; você não precisairia colocair a stack de trás paira contornair esse problema, embora você esteja fazendo isso por razões inteiramente diferentes, mas é difícil dizer sem mais informações.

    Sua pergunta não é suficientemente claira, faça perguntas mais simples e precisas … E, como você disse acima

    popBackStack não cairrega o último fragment, é comumente usado paira exibir toda a stack:

     fragmentManager.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE); 

    antes de cairregair outro fragment

     beginTransaction() replace() Or add() commit() 

    É isso que eu consigo pensair com essa pergunta

    Boa sorte

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