Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android編程入門 >> Android的Fragment中onActivityResult不被調用的解決方案

Android的Fragment中onActivityResult不被調用的解決方案

編輯:Android編程入門

 

 

  常見的,我們會在FragmentActivity中嵌套一層Fragment使用,甚至兩次或多層Fragment嵌套使用。這個時候,在第二級或者更深級別的Fragment調用startActivityForResult方法時,將無法收到onActivityResult回調。閱讀FragementActivity源碼後發現,原來是源碼裡沒有處理嵌套Fragment的情況,也就是說回調只到第一級Fragment,就沒有繼續分發。我們可以實現一個自己的AppCompatActivity,來實現繼續分發,如下:

 

 public class CustomAppCompatActivity extends AppCompatActivity {
 
 
     private static final String TAG = "TAG";
 
 
     /**
      * 重寫onactivityresult方法,使二個或多個fragment嵌套使用時能收到onactivityresut回調
      * @param requestCode
      * @param resultCode
      * @param data
      */
     @Override
     protected void onActivityResult(int requestCode, int resultCode, Intent data) {
         FragmentManager fm = getSupportFragmentManager();
         int index = requestCode >> 16;
         if (index != 0) {
             index--;
             if (fm.getFragments() == null || index < 0
                     || index >= fm.getFragments().size()) {
                 Log.w(TAG, "Activity result fragment index out of range: 0x"
                         + Integer.toHexString(requestCode));
                 return;
             }
             Fragment frag = fm.getFragments().get(index);
             if (frag == null) {
                 Log.w(TAG, "Activity result no fragment exists for index: 0x"
                         + Integer.toHexString(requestCode));
             } else {
                 handleResult(frag, requestCode, resultCode, data);
             }
             return;
         }
 
     }
 
     /**
      * 遞歸調用,對所有子Fragement生效
      *
      * @param frag
      * @param requestCode
      * @param resultCode
      * @param data
      */
     private void handleResult(Fragment frag, int requestCode, int resultCode,
                               Intent data) {
         frag.onActivityResult(requestCode & 0xffff, resultCode, data);
         List<Fragment> frags = frag.getChildFragmentManager().getFragments();
         if (frags != null) {
             for (Fragment f : frags) {
                 if (f != null)
                     handleResult(f, requestCode, resultCode, data);
             }
         }
     }
 
 }

然後我們的Activity繼承這個CustomAppCompatActivity即可,但是要注意,在Fragment中調用startActivityForResult時,一定要調用根Fragment的啟動方法,如下:

 

/**
  * 得到根Fragment
  * 
  * @return
  */
 private Fragment getRootFragment() {
  Fragment fragment = getParentFragment();
  while (fragment.getParentFragment() != null) {
   fragment = fragment.getParentFragment();
  }
  return fragment;

 }

 /**
  * 啟動Activity
  */
 private void onClickTextViewRemindAdvancetime() {
  Intent intent = new Intent();
  intent.setClass(getActivity(), YourActivity.class);
  intent.putExtra("TAG","TEST"); 
  getRootFragment().startActivityForResult(intent, 1000);
 }
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved