当相机活动返回时,承载这个片段的活动有它的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);
}
}
对于许多嵌套片段(例如,当在片段中使用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”。
You can simply override BaseActivity onActivityResult on fragment baseActivity.startActivityForResult .
On BaseActivity add interface and override onActivityResult.
private OnBaseActivityResult baseActivityResult;
public static final int BASE_RESULT_RCODE = 111;
public interface OnBaseActivityResult{
void onBaseActivityResult(int requestCode, int resultCode, Intent data);
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(getBaseActivityResult() !=null && requestCode == BASE_RESULT_RCODE){
getBaseActivityResult().onBaseActivityResult(requestCode, resultCode, data);
setBaseActivityResult(null);
}
On Fragment implements OnBaseActivityResult
@Override
public void onBaseActivityResult(int requestCode, int resultCode, Intent data) {
Log.d("RQ","OnBaseActivityResult");
if (data != null) {
Log.d("RQ","OnBaseActivityResult + Data");
Bundle arguments = data.getExtras();
}
}
这个变通方法会奏效。
选项1:
如果你从片段调用startActivityForResult(),那么你应该调用startActivityForResult(),而不是getActivity().startActivityForResult(),因为它将导致片段onActivityResult()。
如果你不确定你在哪里调用startActivityForResult()和你将如何调用方法。
选项2:
由于Activity获得onActivityResult()的结果,您将需要覆盖活动的onActivityResult()并调用super.onActivityResult()来传播到未处理的结果代码或所有的各自片段。
如果以上两个选项都不管用,那么请参考选项3,因为它肯定会起作用。
选项3:
从fragment显式调用onActivityResult函数如下所示。
在父Activity类中,重写onActivityResult()方法,甚至在Fragment类中重写同样的方法,并像下面的代码一样调用。
在父类中:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
Fragment fragment = getSupportFragmentManager().findFragmentById(R.id.dualPane);
fragment.onActivityResult(requestCode, resultCode, data);
}
在儿童班:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// In fragment class callback
}
我也面临着同样的问题,一旦我把这段代码从一个片段转移到一个实用工具类,将parentActivity作为参数传递,
Intent intent = new Intent(parentActivity, CameraCaptureActivity.class);
parentActivity.startActivityForResult(intent,requestCode);
然后我没有得到任何值在onActivityResult方法的片段,
之后,我把参数改为Fragment,所以修改后的method定义是这样的,
Intent intent = new Intent(fragment.getContext(), CameraCaptureActivity.class);
fragment.startActivityForResult(intent,requestCode);
在那之后,我能够在片段上的onActivityResult中获得值
我只是做了一个变通方法:
public static Fragment _tempFragment = null;
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(_tempFragment != null)
_tempFragment.onActivityResult(requestCode, resultCode, data);
}
在Fragment中,在startActivityResult之前,设置
MainActivity._tempFragment = this;
在片段中的onActivityResult <——之后
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
// Do your job
{
}
MainActivity._tempFragment = null;
}
原来的帖子。
FragmentActivity用修改过的requestCode替换requestCode。之后,当onActivityResult()将被调用时,FragmentActivity将解析较高的16位并恢复原始Fragment的索引。看看这个方案:
如果在根级别上有一些片段,就没有问题。但是如果你有嵌套的片段,比如在ViewPager里面有几个标签的片段,你肯定会遇到问题(或者已经遇到了)。
因为只有一个索引存储在requestCode中。这是Fragment在FragmentManager中的索引。当我们使用嵌套片段时,会有子片段管理器,它们有自己的片段列表。因此,有必要保存从根FragmentManager开始的整个索引链。
我们如何解决这个问题?在这篇文章中有一个常见的变通方案。
GitHub: https://github.com/shamanland/nested-fragment-issue