Eu tenho um aplicativo que consiste em usar o ActionBarSherlock no modo de guia. Eu tenho 5 guias e o conteúdo de cada guia é tratado com fragmentos. Para tab2, porém, eu tenho um fragmento cujo arquivo xml contém um elemento ViewPager que, por sua vez, tem algumas páginas de fragmento. Quando eu inicio o aplicativo pela primeira vez, eu consigo alternar entre as guias sem problemas, mas quando pressiono a guia 2 pela segunda vez, recebo o erro mencionado acima. A atividade principal é a seguinte:
public class MainActivity extends SherlockFragmentActivity
{
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ActionBar actionBar = getSupportActionBar();
ActionBar.Tab tab1 = actionBar.newTab().setText("Tab1");
ActionBar.Tab tab3 = actionBar.newTab().setText("Tab3");
ActionBar.Tab tab2 = actionBar.newTab().setText("Tab2");
ActionBar.Tab tab4 = actionBar.newTab().setText("Tab4");
ActionBar.Tab tab5 = actionBar.newTab().setText("Tab5");
Fragment fragment1 = new Tab1();
Fragment fragment3 = new Tab3();
Fragment fragment2 = new Tab2();
Fragment fragment5 = new Tab5();
Fragment fragment4 = new Tab4();
tab1.setTabListener(new MyTabListener(fragment1));
tab3.setTabListener(new MyTabListener(fragment3));
tab2.setTabListener(new MyTabListener(fragment2));
tab5.setTabListener(new MyTabListener(fragment5));
tab4.setTabListener(new MyTabListener(fragment4));
actionBar.addTab(tab1);
actionBar.addTab(tab2);
actionBar.addTab(tab3);
actionBar.addTab(tab4);
actionBar.addTab(tab5);
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
}
class MyTabListener implements ActionBar.TabListener
{
Fragment fragment;
public MyTabListener(Fragment fragment)
{
this.fragment = fragment;
}
@Override
public void onTabSelected(com.actionbarsherlock.app.ActionBar.Tab tab,FragmentTransaction ft)
{
ft.replace(R.id.fragment_container,fragment);
}
@Override
public void onTabUnselected(com.actionbarsherlock.app.ActionBar.Tab tab,FragmentTransaction ft)
{
}
@Override
public void onTabReselected(com.actionbarsherlock.app.ActionBar.Tab tab,FragmentTransaction ft)
{
}
}
}
A classe de fragmento sem o ViewPager é a seguinte:
public class Tab1 extends Fragment
{
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState)
{
return inflater.inflate(R.layout.activity_tab1, container, false);
}
}
A classe de fragmento com o ViewPager é a seguinte:
public class Tab2 extends Fragment
{
ViewPager mViewPager;
private MyFragmentPagerAdapter mMyFragmentPagerAdapter;
private static int NUMBER_OF_PAGES = 5;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState)
{
View view = inflater.inflate(R.layout.activity_tab2, container, false);
return view;
}
@Override
public void onViewCreated(View view,Bundle savedInstanceState)
{
super.onViewCreated(view, savedInstanceState);
mViewPager = (ViewPager) view.findViewById(R.id.viewpager);
mMyFragmentPagerAdapter = new MyFragmentPagerAdapter(getChildFragmentManager());
mViewPager.setAdapter(mMyFragmentPagerAdapter);
}
private static class MyFragmentPagerAdapter extends FragmentPagerAdapter
{
public MyFragmentPagerAdapter(FragmentManager fm)
{
super(fm);
}
@Override
public Fragment getItem(int index)
{
return PageFragment.newInstance("My Message " + index);
}
@Override
public int getCount()
{
return NUMBER_OF_PAGES;
}
}
}
Pelo que li em diferentes lugares (e corrija-me se estiver errado), isso acontece porque o gerenciador de fragmentos na segunda passagem tenta reaproveitar os fragmentos da atividade que não existe mais dando o erro. Mas não sei por que isso acontece aqui, já que não estou usando atividade de fragmento. De acordo com o logcat, o erro está na classe Tab2, método onViewCreated na linha que diz mViewPager.setAdapter (mMyFragmentPagerAdapter). Qualquer ajuda é muito apreciada, obrigado.
03-04 12:01:05.468: E/AndroidRuntime(2474): FATAL EXCEPTION: main
03-04 12:01:05.468: E/AndroidRuntime(2474): java.lang.IllegalStateException: Activity has been destroyed
03-04 12:01:05.468: E/AndroidRuntime(2474): at android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1342)
03-04 12:01:05.468: E/AndroidRuntime(2474): at android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:595)
03-04 12:01:05.468: E/AndroidRuntime(2474): at android.support.v4.app.BackStackRecord.commitAllowingStateLoss(BackStackRecord.java:578)
03-04 12:01:05.468: E/AndroidRuntime(2474): at android.support.v4.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:139)
03-04 12:01:05.468: E/AndroidRuntime(2474): at android.support.v4.view.ViewPager.populate(ViewPager.java:1011)
03-04 12:01:05.468: E/AndroidRuntime(2474): at android.support.v4.view.ViewPager.populate(ViewPager.java:880)
03-04 12:01:05.468: E/AndroidRuntime(2474): at android.support.v4.view.ViewPager.setAdapter(ViewPager.java:433)
03-04 12:01:05.468: E/AndroidRuntime(2474): at com.example.tabs.Tab2.onViewCreated(Tab2.java:31)
03-04 12:01:05.468: E/AndroidRuntime(2474): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:925)
03-04 12:01:05.468: E/AndroidRuntime(2474): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1088)
03-04 12:01:05.468: E/AndroidRuntime(2474): at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682)
03-04 12:01:05.468: E/AndroidRuntime(2474): at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1444)
03-04 12:01:05.468: E/AndroidRuntime(2474): at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:429)
03-04 12:01:05.468: E/AndroidRuntime(2474): at android.os.Handler.handleCallback(Handler.java:587)
03-04 12:01:05.468: E/AndroidRuntime(2474): at android.os.Handler.dispatchMessage(Handler.java:92)
03-04 12:01:05.468: E/AndroidRuntime(2474): at android.os.Looper.loop(Looper.java:123)
03-04 12:01:05.468: E/AndroidRuntime(2474): at android.app.ActivityThread.main(ActivityThread.java:3687)
03-04 12:01:05.468: E/AndroidRuntime(2474): at java.lang.reflect.Method.invokeNative(Native Method)
03-04 12:01:05.468: E/AndroidRuntime(2474): at java.lang.reflect.Method.invoke(Method.java:507)
03-04 12:01:05.468: E/AndroidRuntime(2474): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:842)
03-04 12:01:05.468: E/AndroidRuntime(2474): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600)
03-04 12:01:05.468: E/AndroidRuntime(2474): at dalvik.system.NativeStart.main(Native Method)
fonte
Respostas:
Este parece ser um bug no suporte recém-adicionado para fragmentos aninhados. Basicamente, a criança
FragmentManager
acaba com um estado interno quebrado quando é desligada da atividade. Uma solução alternativa de curto prazo que corrigiu isso para mim é adicionar o seguinte aonDetach()
cada umFragment
que você chamargetChildFragmentManager()
:fonte
Estou tendo exatamente o mesmo problema. A única solução alternativa que encontrei é substituir os fragmentos por uma nova instância, cada vez que as guias são alteradas.
Não é uma solução real, mas não encontrei uma maneira de reutilizar a instância do fragmento anterior ...
fonte
Eu encontrei o mesmo problema ao chamar
super.onCreate()
no final do meu método. O motivo:attachActivity()
é chamado em onCreate () de FragmentActivity. Ao substituironCreate()
e, por exemplo, criar guias, o gerenciador de guias tentará alternar para um fragmento, embora não tenha a atividade anexada ao FragmentManager.Solução simples: mova a chamada para
super.onCreate()
para o cabeçalho do corpo da função.Em geral, parece que esse problema pode ocorrer por vários motivos. Este é só mais um ...
Matthias
fonte
Queria acrescentar que meu problema estava em uma atividade onde tentei fazer um
FragmentTransaction
onCreate ANTES de ligarsuper.onCreate()
. Acabei de passarsuper.onCreate()
para o topo da função e funcionou bem.fonte
Tive este erro porque estava usando LocalBroadcastManager e fiz:
ao invés de:
fonte
Eu encontrei o mesmo problema e lateron descobriu que, eu perdi chamada para
super.onCreate( savedInstanceState );
emonCreate()
de FragmentActivity.fonte
Recebi o mesmo erro ao tentar acessar o filho
FragmentManager
antes que o fragmento fosse totalmente inicializado (ou seja, anexado à Activity ou pelo menosonCreateView()
chamado). Caso contrário, oFragmentManager
é inicializado com umanull
Activity causando a exceção mencionada anteriormente.fonte
Eu forço o fragmento que contém o fragmento filho a NULL em onPause e isso corrige meu problema
fonte
Eu sei que esta é uma postagem antiga, mas as respostas sugeridas não funcionaram no meu final. Quero deixar isso aqui para o caso de alguém achar útil.
O que eu fiz foi:
Então em:
fonte
Eu tive esse problema e não consegui encontrar a solução aqui, então quero compartilhar minha solução caso outra pessoa tenha o problema novamente.
Eu tinha este código:
e resolveu o problema excluindo a linha "onDestroy ();"
O motivo pelo qual escrevi o código inicial: sei que quando você executa "finish ()", a atividade chama "onDestroy ()", mas estou usando threads e queria garantir que todas as threads sejam destruídas antes de iniciar a próxima atividade , e parece que "terminar ()" nem sempre é imediato. Preciso processar / reduzir muito “Bitmap” e exibir grandes “bitmaps” e estou trabalhando para melhorar o uso da memória em meu aplicativo
Agora vou matar os threads usando um método diferente e vou executar esse método de "onDestroy ();" e quando acho que preciso matar todos os fios.
fonte
Eu tive esse problema e percebi que era porque eu estava chamando
setContentView(int id)
duas vezes em meusActivity
'sonCreate
fonte
Este me deixou louco por Xamarin.
Corri para isso com uma implementação ViewPager para TabLayout dentro de um Fragment, que é implementado no DrawerLayout:
Portanto, você deve implementar o código a seguir em seu DrawerFragment . Esteja ciente de escolher o FragmentManager-Path correto. Porque você pode ter duas referências FragmentManager diferentes:
-> Escolha o que você usa. Se você quiser usar o ChildFragmentManager, deve usar a declaração de classe Android.App.FragmentManager para o seu ViewPager!
Android.Support.V4.App.FragmentManager
Implemente o seguinte método em seu fragmento "Principal" - neste exemplo: DrawerFragment
Android.App.FragmentManager
Isso significa que você teve que iniciar o ViewPager com Android.App.FragmentManager.
Implemente o seguinte método em seu fragmento "Principal" - neste exemplo: DrawerFragment
fonte
O bug foi corrigido na versão mais recente do androidx. E a famosa solução alternativa causará um crash agora. então não precisamos disso agora.
fonte