2010-11-10 26 views
0

我有一個主活動中,可以揭開序幕子活動B,C或D.我開始使用他們startActivityForResult(newIntent,REQUEST_CODE);的Android finishActivity總是導致onActivityResult得到RESULT_CANCELED

用戶可以選擇B,C之間進行導航,以及d當一個被顯示。活動A控制導航。當他們選擇屏幕'A'之間的交換時,首先調用finishActivity(REQUEST_CODE);在顯示的那個上,然後調用startActivityForResult(newIntent,REQUEST_CODE);爲下一個。

在我onActivityResult我有

protected void onActivityResult(int requestCode, int resultCode, Intent data) 
    { 
     // these logs are just for my debugging 
     Log.w(this.toString(), "onActivityResult returned to by " + requestCode); 
     Log.w(this.toString(), "result code = " + resultCode); 

     // the Activity set this value if it was returning normally 
     if (RESULT_OK == resultCode) 
     { 
     Log.i(this.toString(), "---- the sub-activity returned OK ----"); 
     // do some stuff  

     }// end if (RESULT_OK == resultCode) 
     // Else we got here because the user hit the back button or something went 
     // went wrong (RESULT_CANCELED). Either way we do not want to display this 
     // blank screen to the user. Take them back to the device connection screen. 
     else if (RESULT_CANCELED == resultCode) 
     {  
     finish(); 
     } 
    } 

出於某種原因,我又回到了零或RESULT_CANCELED每次即使我的子活動B,C,DI只有當用戶設置的結果選擇打開後退按鈕(我顯示一個「你確定」對話框,並且他們選擇退出,在B,C,DI中有onPause中的以下內容:userExiting是我從Exit對話框中設置的一個標誌

protected void onPause() 
    { 
     Log.i(this.toString(), "onPause"); 

     // hack to try to setResult for an activity whose finishActivty was called 
     if (!this.exiting) 
     { 
     Log.i(this.toString(), "======== RESULT_OK ========"); 
     Intent returnIntent = new Intent(); 
     setResult(RESULT_OK, returnIntent); 
     finish(); 
     } 

     displayed = false; 

     super.onPause(); 
    } 

任何想法?

編輯 - 要清楚的問題是,在舊Activity上調用finishActivty之後,由於結果從未設置,所以Activity A始終認爲它應該退出。一個奇怪的副產品。直到用戶導航兩次纔會發生這種情況。換句話說,B顯示,他們選擇去C.作品,但我可以在日誌中看到onActivityResult尚未被調用。用戶選擇從C到D,繁榮,我看到兩個調用onActivtyResult,'A;退出並且D保持顯示,並且用戶無法離開。

更新:由於這已經得到了很多的意見,我想我會發布此更新。該項目演變成有時會顯示單個活動,有時會將一個組顯示爲選項卡。在某些情況下,當用戶打包出標籤時,需要將數據返回到啓動標籤的活動。在我添加RESULT_CANCELED下面的代碼之前,總是會返回。還要確保在完成之前調用setResult。

if (getParent() == null) 
{ 
    setResult(Activity.RESULT_OK, intent); 
} 
else 
{ 
    getParent().setResult(Activity.RESULT_OK, intent); 
} 
+0

順便說一下,你確定在回到活動中時確實需要展示一個確定的對話框嗎?我會發現真的很煩人。相反,您應該讓用戶輕鬆回到他們所在的位置。 – 2010-11-11 00:45:59

+0

在我的情況下,我的要求不是讓他們回到他們所在的位置,而是在我們讓「確定」對話用戶不小心退出之前,如果他們退後,退出。一旦他們離開A並且接近B,C和D,他們就永遠不會回到A. – bursk 2010-11-11 01:25:58

+0

哦,也許這是因爲這不是後退按鈕的預期行爲。如果我在一個屏幕上,我將移動到一個新屏幕,然後回到原來的屏幕。如果你遵循人們期待的範例,那麼問題會更少。 – 2010-11-11 16:13:42

回答

2

我不是很追隨你在這裏做的所有事情,但它聽起來不像你正在正確地在活動之間導航。我強烈建議徹底閱讀notepad example,以便了解在活動之間移動的android方式。

這是我瞭解有關你想什麼來實現:活動A可以導航到B,C或D.從B,C或d可以導航到任何其他人。

你以某種方式設法使用活動A作爲控制器,讓它完成其他活動。不要這樣做。每個活動都應該負責在適當的時候完成自己的活動。

如果你想從具有去 - 在堆棧上> B到A - > C,那麼我會做到這一點:

一種結果了B。當用戶在B中選擇一些要求去C的時候,你有幾個選擇。你可以讓B開始C而不是結果,然後結束。當C退出時,這會產生B從堆棧中移除的效果。或者,你可以讓B完成自己,傳回一個註釋,C應該加載到結果意圖中。然後A可以加載C得到結果。

我真的不知道爲什麼你想要這種行爲。作爲一名Android用戶,如果我從A - > B - > C出發,我期待回到我身邊回到B.

另一方面,你的「正在退出」黑客沒有任何意義。當你進入onPause時,結果已經被設置。你不能在這裏改變它。在完成之前,您需要在onPause之前正確設置結果。

+0

感謝您的迴應。我沒有做記事本的例子,但現在會這樣做。你是對的,我正在使用'A'作爲控制器(可能是不正確的,如果系統殺死它,我會遇到麻煩)。我聽到你對「退出」和「後退」按鈕的評論,但是我必須忍受它的要求。棘手的問題是我的應用程序正在與服務器進行協調,因此C只能間接導航到D.儘管它對用戶來說看起來很透明。當用戶選擇從C到D時,C向服務器發送請求。如果服務器響應正常,則A實際獲得該消息並告訴D啓動。 – bursk 2010-11-11 20:16:33

+0

然後A在C上調用finshActivity。出於某種原因,我還沒有弄清楚我沒有立即回到onActivtyResult。而當我這樣做時,我總是回到0.我甚至嘗試覆蓋onFinish並設置RESULT_OK。但由於某種原因,我沒有看到onFinish被擊中。當我第一次發佈這個問題後,我突然導航到2個不同的屏幕,我會得到兩個返回0.然後,我打電話finishActivity,然後startActivityForResult。我現在已經交換過了,可以多次導航B,C,D,沒有退貨,我按了後退按鈕,確定退出,並且他們都進來了 – bursk 2010-11-11 20:23:26

+0

有什麼可以保持一個活動,以防止它完成? – bursk 2010-11-11 20:23:44

相關問題