2013-01-14 206 views
3

我有一個應用程序,每當我退出通過家庭硬件按鈕的應用程序後不能正常工作的Android應用程序,它應該回到過去的狀態下,應用程序在,但是,當我再次啓動應用程序,該應用程序顯示只有我的標題欄的白色屏幕。當我點擊標題欄的按鈕時,應用程序崩潰,IllegalStateException應用程序無法找到單擊按鈕的方法。恢復活動

我目前正在與Sherlocks片段,其中標題欄是一個操作欄執行。我也使用HTC Rhyme 2.3版(薑餅)。以下是添加片段到我的主應用程序的代碼。

代碼添加的片段的onCreate方法內的活動:

FragmentTransaction trans = getSupportFragmentManager().beginTransaction(); 
Bundle bMain = getIntent().getExtras(); 
String statusCheck = ""; 
if (bMain != null) { 
    statusCheck = bMain.getString("statusCheck"); 
} 
if (statusCheck.equals("web")) { 
    MyWebViewFragment webfrag = new MyWebViewFragment(); 
    trans.add(R.id.container,webfrag, "WebViewFragment"); 
} else if(statusCheck.equals("traveloguelist")) { 
    MyTravelogueListFragment travelfrag = new MyTravelogueListFragment(); 
    trans.add(R.id.container,travelfrag, "TravelogueListFragment"); 
} 
trans.commit(); 

這是代碼當我改變的片段:

MyTravelogueListFragment travelfrag = new MyTravelogueListFragment(); 
getSupportFragmentManager().beginTransaction().replace(R.id.container, travelfrag).addToBackStack(null).commit(); 

[編輯]

經過多次閱讀和運行後,我意識到主要問題是,在恢復應用程序時,實際上再次創建活動。因此,我傳入的一些參數沒有被註冊,導致錯誤的顯示。我THINK這是導致這種情況發生的錯誤:

Previously focused view reported id "myresID" during save, but can't be found during restore. 

不過,我不知道你是怎麼強制應用程序記住片段的以前的狀態?或者還有別的辦法解決這個問題嗎?

我還是很堅持這一問題。如果有人能幫助我,會真的很感激!

回答

4

多的試錯和許多讀數之後,我終於找到了一種方法來排序的解決我的問題。

從我的理解,會發生由於活動的生命週期這個問題。曾國藩在這個論壇的評論是相當全面: http://forum.unity3d.com/threads/127794-Android-Apps-crashing-on-resume

看來期間,當在某個活動onPause/onStop其他應用程序調用的時候,Android可能會釋放一些內存的活動目前正在就到如果沒有足夠的內存需要。在這種情況下,所有當前對象或暫停活動所具有的變量都將被銷燬。因此,當活動重新聚焦時,onCreate實際上被再次調用。因此,活動將不知道我目前需要哪個片段。

但是,我意識到,這將始終調用saveInstanceState這基本上是一個捆綁對象。所以,我做了以下內容:

的onSaveInstanceState方法

@Override 
    public void onSaveInstanceState(Bundle bundle) { 
     //activityFrag is a string object that tells me which fragment i am in currently 
     bundle.putString("statusCheck", activityFrag); 
    } 

onCreate方法

if (savedInstanceState != null) { 
    getSupportFragmentManager().popBackStack(null, getSupportFragmentManager().POP_BACK_STACK_INCLUSIVE); 
    //return; 
    statusCheck = savedInstanceState.getString("statusCheck"); 
} else { 
    statusCheck = b.getString("statusCheck"); 
} 

我所做的是刪除所有我迄今堆疊,以消除任何問題,那裏是片段缺少所需的信息。所以這就像重新開始。狀態檢查只是確定用戶上次訪問過哪個片段。

經過多次測試,它似乎確實能解決我的問題。儘管我不會說這是完美的。我遇到的主要問題之一是,每當我改變我的片段時,我都必須更新並更改statusCheck以確保調用正確的片段。但是,我不得不承認這種方式有點不正確,可能不太正確。

如果您有任何更好的想法,請隨時分享!

+0

我有同樣的崩潰,但我得到了片段中的上下文值。 什麼變量b得到getString(「」),如果我們有savedInstanceState null我們必須調用新鮮 – Prasad

0

你可以嘗試實施以下:

  1. 使用putFragment保存所有的碎片,目前位於FragmentManager,成捆的onSaveInstanceState;
  2. 然後您可以使用getFragmentonRestoreInstanceState中的包中獲取以前存儲的所有片段。

而且......你可能需要一些HashMap的,這將有助於確定片段的層次結構(如果你有容器和載片段)被保存成束爲好。

另外...從包中恢復時,您需要知道您之前放置在那裏的所有片段的密鑰。可能最簡單的方法就是組織一個鍵數組,並在將片段保存到實例中時將其放入數據包中。

這樣你的保存和恢復將是完整和集中的。