2011-10-19 43 views
3

在我的onCreate方法我有這個隨機片段問題

// Create new fragment and transaction 
myFragment = new MyFragment(); 
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); 
transaction.replace(R.id.downPart, myFragment); 
transaction.commit(); 

問題是somethimes與此錯誤

Caused by: android.support.v4.app.Fragment$InstantiationException: Unable to instantiate fragment com.pakagename.pak1.MyFragmentsActivity: make sure class name exists, is public, and has an empty constructor that is public 

它trows forseclose消息,但它只是有時是隨機的,有時我開始了我的應用程序和作品很好,例如它的工作原理好像在行工作10次罰款,然後當我開始它崩潰... 之後,再次工作

我可以'不知道爲什麼它有時會崩潰,如果有其他應用程序在後臺運行,並且不知何故它們會減慢我的cpu或佔用大量內存,是否有可能會崩潰,我真的不明白這種隨機行爲。

+0

不應該layoutFragment是myFragment。只是一個觀察。 –

+0

transaction.replace(R.id.downPart,myFragment); – user370305

+0

是的,它應該是myFragment看到我的編輯,但這是在複製到我的項目中的stackoverflow論壇被稱爲bottomf時錯過的東西。沒關係,這不是我的問題,如果有這樣的錯誤,那麼它將無法在任何情況下工作...注意我的應用程序的作品完美大部分時間我開始它 – Lukap

回答

4

如果您添加FragmentFragmentManager,Android將保存其狀態並重新創建它們,如果應用程序的過程中殺過回收內存等「最小化」您的應用程序(按HOME鍵),然後打開許多其他的應用程序將導致這一點。當你返回時,它只能重新創建你的片段,如果錯誤提示片段類名存在,是公共的,並且有一個空的公共構造函數。

您沒有向我們展示MyFragment的代碼,但我猜測其中一種情況並非如此。特別是,MyFragment很可能是您的活動的一個(非靜態)內部類。內部類只能在外部類的實例中實例化,但Android在重新創建片段時會從另一個上下文中執行此操作。這就是爲什麼將片段作爲內部類的問題。

要修復它,請確保MyFragment是靜態內部類或其自己的類,並且構造函數是公共的(或不存在;它將使用默認的類)。一個靜態的內部類可以不存在其外部類的實例而存在(並且不能訪問任何實例變量)。

您可以在啓動應用程序後按回家來測試此功能(將調用onSaveInstanceState),使用DDMS殺死進程,然後重新啓動您的應用程序。或者,嘗試使用原來的步驟,以便在其間打開許多其他應用程序。

+0

嗨安東尼,我有一個不同的問題,但它被重新創建通過您在答案底部描述的測試。當我按下家後殺死這個過程時,打開的碎片會疊加在彼此之上?它們被添加到後端堆棧,這是這個問題之一嗎? – StuStirling

+0

@ DiscoS2我認爲所有這些片段問題都非常相似。你可以用一些代碼爲它創建一個問題,如果可以的話,我會回答它。否則,也許別人可以幫助:) – antonyt