当相机活动返回时,承载这个片段的活动有它的onActivityResult被调用。
我的片段开始一个活动的结果与意图发送给相机拍照。图片应用程序加载正常,拍摄照片并返回。然而onActivityResult从未被击中。我设置了断点,但什么都没有触发。一个片段可以有onActivityResult吗?我想是的,因为它是一个已提供的函数。为什么这个没有被触发?
ImageView myImage = (ImageView)inflatedView.findViewById(R.id.image);
myImage.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(cameraIntent, 1888);
}
});
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if( requestCode == 1888 ) {
Bitmap photo = (Bitmap) data.getExtras().get("data");
((ImageView)inflatedView.findViewById(R.id.image)).setImageBitmap(photo);
}
}
其他答案中没有描述的另一个用例:
当使用exception.startResolutionForResult()时,在fragment中声明的onActivityResult()不会被调用:
if (exception is ResolvableApiException) {
exception.startResolutionForResult(activity!!, MY_REQUEST_CODE)
}
在这种情况下,将exception.startResolutionForResult()替换为fragment的startIntentSenderForResult():
if (exception is ResolvableApiException) {
startIntentSenderForResult(exception.resolution.intentSender, MY_REQUEST_CODE, null, 0, 0, 0, null)
}
首先你需要在Activity中重写这段代码;
@Override
public void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
}
之后,在你的片段中,
startActivityForResult(intent,GALLERY_REQUEST_CODE);
在你的片段中,
@Override
public void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
// Result code is RESULT_OK only if the user selects an Image
if (resultCode == Activity.RESULT_OK) {
}
}
对于Android的导航组件,当你嵌套fragment时,这个问题就像一个无法解决的谜。
基于以下回答的知识和灵感,我想出了一个简单的解决方案:
在这篇文章中回答
在这篇文章中回答
在你的活动的onActivityResult()中,你可以循环使用FragmentManager的getFragments()方法获得的活动片段列表。
请注意,要做到这一点,您需要使用getSupportFragmentManager()或目标API 26及以上。
这里的想法是循环遍历列表,使用instanceof检查列表中每个Fragment的实例类型。
虽然循环这个Fragment类型的列表是理想的,但不幸的是,当你使用Android导航组件时,列表将只有一个项目,即NavHostFragment。
现在怎么办?我们需要让碎片知道NavHostFragment。NavHostFragment本身就是一个Fragment。因此,使用getChildFragmentManager(). getfragments(),我们再次得到一个List<Fragment>的片段已知我们的NavHostFragment。我们循环遍历这个列表,检查每个Fragment的实例。
一旦我们在列表中找到我们感兴趣的片段,我们就调用它的onActivityResult(),将活动的onActivityResult()声明的所有参数传递给它。
// Your activity's onActivityResult()
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
List<Fragment> lsActiveFragments = getSupportFragmentManager().getFragments();
for (Fragment fragmentActive : lsActiveFragments) {
if (fragmentActive instanceof NavHostFragment) {
List<Fragment> lsActiveSubFragments = fragmentActive.getChildFragmentManager().getFragments();
for (Fragment fragmentActiveSub : lsActiveSubFragments) {
if (fragmentActiveSub instanceof FragWeAreInterestedIn) {
fragmentActiveSub.onActivityResult(requestCode, resultCode, data);
}
}
}
}
}
你的代码有一个嵌套的片段。调用超。onActivityForResult不起作用
你不希望修改你的片段可以被调用的每个活动,或者绕过调用片段链中的每个片段。
这是许多可行的解决方案之一。动态地创建一个片段,并使用支持片段管理器将其直接连接到活动。然后从新创建的片段调用startActivityForResult。
private void get_UserEmail() {
if (view == null) {
return;
}
((TextView) view.findViewById(R.id.tvApplicationUserName))
.setText("Searching device for user accounts...");
final FragmentManager fragManager = getActivity().getSupportFragmentManager();
Fragment f = new Fragment() {
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
startActivityForResult(AccountPicker.newChooseAccountIntent(null, null,
new String[]{"com.google"}, false, null, null, null, null), REQUEST_CODE_PICK_ACCOUNT);
}
@Override
public void onActivityResult(int requestCode, int resultCode,
Intent data) {
if (requestCode == REQUEST_CODE_PICK_ACCOUNT) {
String mEmail = "";
if (resultCode == Activity.RESULT_OK) {
if (data.hasExtra(AccountManager.KEY_ACCOUNT_NAME)) {
mEmail = data
.getStringExtra(AccountManager.KEY_ACCOUNT_NAME);
}
}
if (mActivity != null) {
GoPreferences.putString(mActivity, SettingApplication.USER_EMAIL, mEmail);
}
doUser();
}
super.onActivityResult(requestCode, resultCode, data);
fragManager.beginTransaction().remove(this).commit();
}
};
FragmentTransaction fragmentTransaction = fragManager
.beginTransaction();
fragmentTransaction.add(f, "xx" + REQUEST_CODE_PICK_ACCOUNT);
fragmentTransaction.commit();
}
对于许多嵌套片段(例如,当在片段中使用ViewPager时)
在你的主要活动:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
}
在你的片段中:
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
for (Fragment fragment : getChildFragmentManager().getFragments()) {
fragment.onActivityResult(requestCode, resultCode, data);
}
}
在你的嵌套片段中
调用活动
getParentFragment().startActivityForResult(intent, uniqueInstanceInt);
uniqueInstanceInt—将其替换为嵌套片段中唯一的int,以防止另一个片段处理答案。
接收响应
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == uniqueInstanceInt ) {
// TODO your code
}
}
注意
在uniqueInstanceInt中需要使用0到65536之间的数字,以避免错误“只能使用低16位的requestCode”。