当前位置:天才代写 > tutorial > 安卓教程 > Android的Fragment中onActivityResult不被调用的解决方案

Android的Fragment中onActivityResult不被调用的解决方案

2021-02-02 15:05 星期二 所属: 安卓教程 浏览:21

 

 

  普遍的,大家会在FragmentActivity中嵌入一层Fragment应用,乃至2次或双层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);
 }
 

    关键字:

天才代写-代写联系方式