Saya memiliki aplikasi yang terdiri dari penggunaan ActionBarSherlock dalam mode tab. Saya memiliki 5 tab dan konten setiap tab ditangani menggunakan fragmen. Untuk tab2, saya memiliki sebuah fragmen yang file xml-nya berisi elemen ViewPager yang pada gilirannya memiliki beberapa halaman fragmen. Ketika saya awalnya memulai aplikasi aplikasi, saya dapat beralih antar tab tidak ada masalah tetapi ketika saya menekan tab2 untuk kedua kalinya saya mendapatkan kesalahan yang disebutkan di atas. Kegiatan utamanya adalah sebagai berikut:
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)
{
}
}
}
Kelas fragmen tanpa ViewPager adalah sebagai berikut:
public class Tab1 extends Fragment
{
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState)
{
return inflater.inflate(R.layout.activity_tab1, container, false);
}
}
Kelas fragmen dengan ViewPager adalah sebagai berikut:
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;
}
}
}
Dari apa yang saya baca di tempat yang berbeda (dan tolong koreksi saya jika saya salah), ini terjadi karena pengelola fragmen pada lintasan kedua mencoba menggunakan kembali fragmen dari aktivitas yang sudah tidak ada lagi sehingga menimbulkan kesalahan. Tapi saya tidak yakin mengapa ini terjadi di sini karena saya tidak menggunakan aktivitas fragmen. Menurut logcat, error ada di kelas Tab2, metode onViewCreated pada baris yang bertuliskan mViewPager.setAdapter (mMyFragmentPagerAdapter). Setiap bantuan sangat dihargai ... Terima kasih.
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)
sumber
Jawaban:
Ini tampaknya merupakan bug dalam dukungan yang baru ditambahkan untuk fragmen bersarang. Pada dasarnya, anak
FragmentManager
berakhir dengan keadaan internal yang rusak saat terlepas dari aktivitas. Solusi jangka pendek yang memperbaikinya bagi saya adalah menambahkan yang berikut ini keonDetach()
setiapFragment
yang Anda hubungigetChildFragmentManager()
:sumber
Saya mengalami masalah yang persis sama. Satu-satunya solusi yang saya temukan, adalah mengganti fragmen dengan instance baru, setiap kali tab diubah.
Bukan solusi nyata, tetapi saya belum menemukan cara untuk menggunakan kembali contoh fragmen sebelumnya ...
sumber
Saya mengalami masalah yang sama saat menelepon
super.onCreate()
di akhir metode saya. Alasan:attachActivity()
dipanggil di onCreate () dari FragmentActivity. Saat menggantionCreate()
dan, misalnya, membuat tab, pengelola Tab akan mencoba beralih ke fragmen sambil tidak memiliki aktivitas yang dilampirkan ke FragmentManager.Solusi sederhana: Pindahkan panggilan ke
super.onCreate()
kepala badan fungsi.Secara umum, tampaknya ada banyak alasan mengapa masalah ini dapat terjadi. Ini hanyalah satu lagi ...
Matthias
sumber
Ingin menambahkan bahwa masalah saya adalah dalam aktivitas di mana saya mencoba masuk ke
FragmentTransaction
onCreate SEBELUM saya meneleponsuper.onCreate()
. Saya baru saja pindahsuper.onCreate()
ke atas fungsi dan bekerja dengan baik.sumber
Saya mengalami kesalahan ini karena saya menggunakan LocalBroadcastManager dan saya melakukannya:
dari pada:
sumber
Saya mengalami masalah yang sama dan kemudian menemukan bahwa, saya telah melewatkan panggilan ke
super.onCreate( savedInstanceState );
dalamonCreate()
FragmentActivity.sumber
Saya mendapat kesalahan yang sama ketika mencoba mengakses anak
FragmentManager
sebelum fragmen diinisialisasi sepenuhnya (yaitu dilampirkan ke Aktivitas atau setidaknyaonCreateView()
dipanggil). Jika tidak,FragmentManager
akan diinisialisasi dengannull
Aktivitas yang menyebabkan pengecualian yang disebutkan di atas.sumber
Saya memaksa fragmen yang berisi fragmen anak menjadi NULL di onPause dan itu memperbaiki masalah saya
sumber
Saya tahu ini adalah posting lama, tetapi jawaban yang disarankan tidak berhasil di pihak saya. Saya ingin meninggalkan ini di sini kalau-kalau ada yang menganggapnya berguna.
Apa yang saya lakukan adalah:
Kemudian di:
sumber
Saya mengalami masalah ini dan saya tidak dapat menemukan solusinya di sini, jadi saya ingin membagikan solusi saya jika ada orang lain yang mengalami masalah ini lagi.
Saya punya kode ini:
dan memecahkan masalah dengan menghapus baris "onDestroy ();"
Alasan saya menulis kode awal: Saya tahu bahwa ketika Anda mengeksekusi "finish ()" aktivitas memanggil "onDestroy ()", tetapi saya menggunakan utas dan saya ingin memastikan bahwa semua utas dihancurkan sebelum memulai aktivitas berikutnya , dan sepertinya "finish ()" tidak selalu langsung. Saya perlu memproses / mengurangi banyak "Bitmap" dan menampilkan "bitmap" yang besar dan saya sedang berupaya meningkatkan penggunaan memori di aplikasi saya
Sekarang saya akan mematikan utas menggunakan metode yang berbeda dan saya akan menjalankan metode ini dari "onDestroy ();" dan ketika saya pikir saya harus mematikan semua utas.
sumber
Saya memiliki masalah ini dan menyadari itu karena aku menelepon
setContentView(int id)
dua kali dalam sayaActivity
'sonCreate
sumber
Yang ini membuatku tergila-gila pada Xamarin.
Saya mengalami ini dengan implementasi ViewPager untuk TabLayout DALAM sebuah Fragmen, yang diimplementasikan dengan sendirinya di DrawerLayout:
Jadi, Anda harus menerapkan kode berikut di DrawerFragment Anda . Berhati-hatilah untuk memilih FragmentManager-Path yang benar. Karena Anda mungkin memiliki dua Referensi FragmentManager yang berbeda:
-> Pilih salah satu yang Anda gunakan. Jika Anda ingin menggunakan ChildFragmentManager, Anda harus menggunakan deklarasi kelas Android.App.FragmentManager untuk ViewPager Anda!
Android.Support.V4.App.FragmentManager
Terapkan Metode berikut dalam Fragmen "Utama" Anda - dalam contoh ini: DrawerFragment
Android.App.FragmentManager
Itu berarti Anda harus membuka ViewPager dengan Android.App.FragmentManager.
Terapkan Metode berikut dalam Fragmen "Utama" Anda - dalam contoh ini: DrawerFragment
sumber
Bug telah diperbaiki di versi androidx terbaru. Dan solusi terkenal akan menyebabkan crash sekarang. jadi kita tidak membutuhkannya sekarang.
sumber