您现在的位置是:主页 > news > 昆明hph网站建设/正规的计算机培训机构

昆明hph网站建设/正规的计算机培训机构

admin2025/5/10 17:07:49news

简介昆明hph网站建设,正规的计算机培训机构,海淀网站建设,WordPress 手机编辑Fragment是常用到的,一般在Activity里我们会套用Fragment的使用,有时是一层,有的时候是多层,当你在第二层的Fragment中调用onActivityResult()方法时,你会发现onActivityResult(&…

昆明hph网站建设,正规的计算机培训机构,海淀网站建设,WordPress 手机编辑Fragment是常用到的,一般在Activity里我们会套用Fragment的使用,有时是一层,有的时候是多层,当你在第二层的Fragment中调用onActivityResult()方法时,你会发现onActivityResult(&…

Fragment是常用到的,一般在Activity里我们会套用Fragment的使用,有时是一层,有的时候是多层,当你在第二层的Fragment中调用onActivityResult()方法时,你会发现onActivityResult()方法不被执行。举个简单的例子



一个主Activity里嵌套了一个fragmentA碎片,fragmentA碎片里又嵌套了一个fragmentB碎片,当我们在fragmentB中调用手机系统相册随机选择一张照片时,当我们选择好了照片,返回到fragmentB中时,我们发现onActivityResu()方法未被执行,所以我们拿不到所选照片的path。为什么会出现这种情况呢

阅读FragmentActivty源码后会发现,原来源码里是没有处理嵌套Fragment的情况,也就是说回调只到第一级Fragment,就没有继续分发。我们可以实现一个自己的BaseActivity,来实现继续分发。

import java.util.List;import android.content.Intent;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.util.Log;
public class BaseActivity extends FragmentActivity {private static final String TAG = "BaseActivity";@Overrideprotected 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继承这个BaseACtivity即可,但是要注意,在Fragment调用startActivityForResult时,一定要调用根Fragment的启动方法,如下:

private Fragment getRootFragment() {Fragment fragment = getParentFragment();while (fragment.getParentFragment() != null) {fragment = fragment.getParentFragment();}return fragment;}

// 从相册中获取public void gallery() {// 激活系统图库,选择一张图片Intent intent = new Intent(Intent.ACTION_PICK,android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);		// 开启一个带有返回值的Activity,请求码为PHOTO_REQUEST_GALLERY// 修改无裁剪getRootFragment().startActivityForResult(intent, UNPHOTO_REQUEST_CUT);}
这样就可以解决上面所说的问题了。