2012年8月17日金曜日

FragmentからstartActivityForResult

FragmentからstartActivityForResultすると、戻ってきた時にActivityのonActivityResultとFragmentのonActivityResultが呼ばれるようなので。。。覚え書き

ソースコードを見るとよくわかるね。

startActivityForResult の動作

Fragment
ActivityのstartActivityFromFragmentを呼んでます。
  1. /** 
  2.  * Call {@link Activity#startActivityForResult(Intent, int)} on the fragment's 
  3.  * containing Activity. 
  4.  */  
  5. public void startActivityForResult(Intent intent, int requestCode) {  
  6.     if (mActivity == null) {  
  7.         throw new IllegalStateException("Fragment " + this + " not attached to Activity");  
  8.     }  
  9.     mActivity.startActivityFromFragment(this, intent, requestCode);  
  10. }  

FragmentActivity
requestCodeをビット演算させてActivityのsuper.startActivityForResultを呼んでます。
  1. /** 
  2.  * Called by Fragment.startActivityForResult() to implement its behavior. 
  3.  */  
  4. public void startActivityFromFragment(Fragment fragment, Intent intent,   
  5.         int requestCode) {  
  6.     if (requestCode == -1) {  
  7.         super.startActivityForResult(intent, -1);  
  8.         return;  
  9.     }  
  10.     if ((requestCode&0xffff0000) != 0) {  
  11.         throw new IllegalArgumentException("Can only use lower 16 bits for requestCode");  
  12.     }  
  13.     super.startActivityForResult(intent, ((fragment.mIndex+1)<<16) + (requestCode&0xffff));  
  14. }  

onActivityResult の動作

FragmentActivity
requestCodeをビット演算でFragmentからstartActivityForResultActivityが実行されてるかチェックして、 FragmentのonActivityResultの呼び出しを制御しています。
  1. /** 
  2.  * Dispatch incoming result to the correct fragment. 
  3.  */  
  4. @Override  
  5. protected void onActivityResult(int requestCode, int resultCode, Intent data) {  
  6.     int index = requestCode>>16;  
  7.     if (index != 0) {  
  8.         index--;  
  9.         if (mFragments.mActive == null || index < 0 || index >= mFragments.mActive.size()) {  
  10.             Log.w(TAG, "Activity result fragment index out of range: 0x"  
  11.                     + Integer.toHexString(requestCode));  
  12.             return;  
  13.         }  
  14.         Fragment frag = mFragments.mActive.get(index);  
  15.         if (frag == null) {  
  16.             Log.w(TAG, "Activity result no fragment exists for index: 0x"  
  17.                     + Integer.toHexString(requestCode));  
  18.         } else {  
  19.             frag.onActivityResult(requestCode&0xffff, resultCode, data);  
  20.         }  
  21.         return;  
  22.     }  
  23.       
  24.     super.onActivityResult(requestCode, resultCode, data);  
  25. }  

Fragment
  1. /** 
  2.  * Receive the result from a previous call to 
  3.  * {@link #startActivityForResult(Intent, int)}.  This follows the 
  4.  * related Activity API as described there in 
  5.  * {@link Activity#onActivityResult(int, int, Intent)}. 
  6.  *  
  7.  * @param requestCode The integer request code originally supplied to 
  8.  *                    startActivityForResult(), allowing you to identify who this 
  9.  *                    result came from. 
  10.  * @param resultCode The integer result code returned by the child activity 
  11.  *                   through its setResult(). 
  12.  * @param data An Intent, which can return result data to the caller 
  13.  *               (various data can be attached to Intent "extras"). 
  14.  */  
  15. public void onActivityResult(int requestCode, int resultCode, Intent data) {  
  16. }  


Y.A.M の 雑記帳: Android Support Package の Fragment から startActivityForResult() を使うときの注意点

1 件のコメント: