2011-12-04 73 views
1

傍晚,當點擊後退按鈕時,請致電onrestart/onresume

我正面臨一個我無法修復的小問題。我有一個「基本」活動(名稱:TestActivity,延伸ActivityGroup),其中包含歷史數組列表。每當我要進行新的活動時,我都會使用以下位來加載新視圖。

Intent intent = new Intent(Start.this, CitySelect.class); 
View view = TestActivity.group.getLocalActivityManager().startActivity("cityselect", intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)).getDecorView(); 
TestActivity.group.replaceView(view); 

正如你可以看到我打電話replaceView方法「替換」的觀點。見下面的代碼:

public void replaceView(View v) 
{ 
    history.add(v); 
    setContentView(v); 
} 

在每一個活動,我重寫onBackPressed

public void back() 
{ 
    if (history.size() > 0) 
    { 
     history.remove(history.size() - 1); 

     if (history.size() > 0) 
     { 
      View v = history.get(history.size() - 1); 
      setContentView(v); 
     } 

     else 
     { 
      finish(); 
     } 
    } 

    else 
    { 
     finish(); 
    } 
} 

現在問題來了:

@Override 
public void onBackPressed() 
{ 
    TestActivity.group.back(); 
} 

back方法見下文當我使用手機上的後退按鈕,以前的活動進入前臺,在視圖(活動)中將不會調用任何內容。當我按照活動生活cyle,我認爲onResume將被稱爲,但事實並非如此。什麼都沒發生。

所以問題是:當我按下後退按鈕時,如何調用onResume方法?

+0

你是什麼意思'沒有任何反應'?你是否正在檢查'onDestroy'是否被調用? – Craigy

+0

'onDestroy'沒有被調用,但'onPaused'。 –

+0

我必須更具體;當我替換視圖時會調用'onPaused'。我的意思是'沒有任何反應'是當前一個視圖回到前景時沒有函數被調用。我期望'onResume'會被調用,但事實並非如此。 –

回答

5

@Commonsware好心地指出(在我的另一篇文章中)ActivityGroups實際上已被棄用。相反,我們應該轉向碎片。

與您一樣的問題與我一直在爭鬥的時間長於我的承認。當您按下後退按鈕後將焦點返回到ActivityGroup中的視圖時,通常使用的工具(OnResume,OnRestart)都不起作用。

不幸的是,我還需要找到一種方法來當按下從的ActivityGroup內後的後退按鈕在我掙扎的的onResume(因爲我投入巨資在使用活動組此遺留代碼)。

希望這會有所幫助。

- 編輯 -

我發現了一個辦法做到這一點:

而不是保持意見的歷史,保持啓動活動的ID的歷史。您開始的每項活動都有一個與其相關的唯一ID。所以,當你回叫()時,檢索活動的ID,並重新開始活動。這將觸發你的活動的「onResume()」方法,如你所願。

這是我怎麼會重組您提供的代碼: 以下位加載新的觀點:

Intent intent = new Intent(Start.this, CitySelect.class); 
View view =  TestActivity.group.getLocalActivityManager().startActivity("cityselect", intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)).getDecorView(); 
TestActivity.group.replaceView(view,"cityselect"); 

的內更換視圖 「replaceView()」 方法:

public void replaceView(View v, String activityId) 
{ 
    history.add(activityId); 
    setContentView(v); 
} 

最後,ActivityGroup中的back()方法:

public void back() 
{ 
if (history.size() > 0) 
{ 
    history.remove(history.size() - 1); 

    if (history.size() > 0) 
    { 
     //View v = history.get(history.size() - 1); 
     //setContentView(v); 

     LocalActivityManager manager = getLocalActivityManager(); 
     String lastId = mIdList.get(history.size()-1); 
     Intent lastIntent = manager.getActivity(lastId).getIntent(); 
     Window newWindow = manager.startActivity(lastId, lastIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)); 
     setContentView(newWindow.getDecorView()); 

    } 

    else 
    { 
     finish(); 
    } 
} 

else 
{ 
    finish(); 
} 

}

希望這可以幫助更多:)

+0

這是工作正常... 謝謝..! – Deepak