2012-05-12 23 views
193

我開始從我的片段的新活動與錯誤requestCode

startActivityForResult(intent, 1); 

,並要處理這個片斷父活動結果:

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    Log.d(TAG, "onActivityResult, requestCode: " + requestCode + ", resultCode: " + resultCode); 
    if (requestCode == 1) { 
     // bla bla bla 
    } 
} 

的問題是,我從來沒有得到了requestCode我剛剛發佈到startActivityForResult()。 我得到了像0x40001,0x20001等隨機更高位集。文檔對此沒有提及。有任何想法嗎?

+0

可能重複http://stackoverflow.com/questions/6147884/onactivityresult-不被稱爲碎片) – PhoneixS

回答

566

您從Fragment打電話給startActivityForResult()。當您這樣做時,requestCode由擁有FragmentActivity更改。

如果你想在你的活動正確resultCode試試這個:

變化:

startActivityForResult(intent, 1); 

要:

getActivity().startActivityForResult(intent, 1); 
+1

結果確實交付給活動,我希望它在那裏交付它只是有錯誤requestCode – Dimanoid

+34

因爲它應該決定哪個片段將結果傳遞給。所以當片段調用StartActivityForResult。 requestCode會被Activity改變,所以它會知道如何將結果傳遞給哪個片段。如果你真的想在Activiy中獲得結果。只需調用getActivity()。startActivityForResult()。 –

+0

很棒的回答。此外,我不是100%,但它似乎只是支持包的一個錯誤: [https://code.google.com/p/android/issues/detail?id=40537](https ://code.google.com/p/android/issues/detail?id = 40537) – matt

5

如果您提供恆定的把它公開,然後用於startActivityResult

示例:

public static final int REQUEST_CODE =1; 
getActivity().startActivityForresult(intent, REQUEST_CODE); 
15

請求代碼沒有錯。當使用v4支持庫碎片時,碎片索引被編碼在請求代碼的前16位,而您的請求代碼位於最後16位。片段索引稍後用於找到正確的片段來傳遞結果。

因此,對於活動開始形式片段對象句柄onActivityResult requestCode象下面這樣: 例如,可以解碼此requestCode像:

originalRequestCode = changedRequestCode - (indexOfFragment < < 16) 6 = 196614 - (3- < < 16)

+0

很好的信息,解釋了這個問題的確切原因 – Muzikant

+0

快速的問題:什麼是indexOfFragment? –

+0

indexOfFragment是getSupportFragmentManager()。getFragments()產生的索引 – HerberthObregon

2

您還可以定義
super.onActivityResult(requestCode, resultCode, data)
Activity 如果重寫() 在這個

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    switch (requestCode) { 

     ... 

     default: 
      super.onActivityResult(requestCode, resultCode, data); 
    } 
} 

,並呼籲startActivityForResult(intent, requestCode)Fragment

5

更容易裏面:

int unmaskedRequestCode = requestCode & 0x0000ffff

檢查的低16位,只是揭露它做邏輯與將高16位清零

protected void onActivityResult(int requestCode, int resultCode, Intent data) { 

    final int unmaskedRequestCode = requestCode & 0x0000ffff 

    if(unmaskedRequestCode == ORIGINAL_REQUEST_CODE){ 
     //Do stuff 

    } 
} 
+0

你能告訴我它爲什麼不給出原始請求代碼的原因嗎? –

+1

導致requestCode被擁有Fragment的Activity改變。見Ashlesha Sharma回答 –

+0

謝謝,這是我正在尋找的答案。我不明白爲什麼Android不應該返回原始請求代碼。 –

0
在片段

getActivity().startActivityForResult(builder.build(getActivity()), PLACE_PICKER_REQUEST); 
在主要活動

if (requestCode == PLACE_PICKER_REQUEST) { 
      if (resultCode == RESULT_OK) {  
    //what ever you want to do 
      } 
的[onActivityResult沒有被調用在片段](
相關問題