onActivityResult 未在 Fragment 中调用
onActivityResult not called in Fragment
在我的 ActivityResult 片段中,在 startActivityForResult 之后没有调用。因为我尝试了以下操作:
1) 添加 getParentFragment , getActivity before startActivityResult
2) 添加到清单 android:configChanges="orientation|screenSize"
3)onActivityResult is not being called in Fragment
4)检查ZbarScanner中的finish()方法Activity
Intent dataIntent = new Intent();
dataIntent.putExtra(SCAN_RESULT, symData);
dataIntent.putExtra(SCAN_RESULT_TYPE, sym.getType());
setResult(Activity.RESULT_OK, dataIntent);
finish();
5) 错误- [ResultInfo{who=null, request=196609, result=-1, data=Intent { (has extras) }}]} checked intent 的值不为空,我们正在传递
if (isCameraAvailable()) {
Intent intent = new Intent(this.getActivity(), ZBarScannerActivity.class);
intent.putExtra(ZBarConstants.SCAN_MODES, new int[]{Symbol.QRCODE});
startActivityForResult(intent, 1);
Toast.makeText(getActivity(), "inside case", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(getActivity(), "Rear Facing Camera Unavailable", Toast.LENGTH_SHORT).show();
}
----在Activity结果-----
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
Bundle bundle = data.getExtras();
switch (requestCode) {
case ZBAR_SCANNER_REQUEST:
case ZBAR_QR_SCANNER_REQUEST:
if (resultCode == getActivity().RESULT_OK) {
Toast.makeText(getActivity(), "Scan Result = " + data.getStringExtra(ZBarConstants.SCAN_RESULT), Toast.LENGTH_SHORT).show();
} else if (resultCode == getActivity().RESULT_CANCELED && data != null) {
String error = data.getStringExtra(ZBarConstants.ERROR_INFO);
if (!TextUtils.isEmpty(error)) {
Toast.makeText(getActivity(), error, Toast.LENGTH_SHORT).show();
}
}}
片段 onActivityResult
是一个非常常见且已知的问题。我已经用一种方法解决了,可能还有其他方法。
像这样从 Activity
移动到 Fragment
时设置标签。
fragmentManager.beginTransaction().replace(R.id.frame_container, fragment,"tag").commit();
现在在 Activity
的 onActivityResult
中编写以下代码。
if (requestCode == 1) { //set your requestcode whichever you are using
//super.onActivityResult(requestCode, resultCode, data);
//dont forget to comment this.
Fragment fragment = (Fragment) getSupportFragmentManager().findFragmentByTag("tag");
if(fragment != null){
fragment.onActivityResult(requestCode, resultCode, data);
}
}
我在片段中使用 FragmentPagerAdapter
时遇到了类似的问题。问题是我用片段的 FragmentManager
初始化了我的 PagerAdapter
,我替换了:
new MyPagerAdapter(getChildFragmentManager());
和
new MyPagerAdapter(getFragmentManager());
因此可能值得检查您使用的是哪个 FragmentManager。我对这种方法还不是 100% 满意,因为调用片段的 FragmentManager
似乎是正确的。但我还没有时间进一步检查它。
我在 MainActivity 上调用了 onActivityResult 并且它没有调用。所以删除了 switch case。它现在可以工作了
switch (requestCode) {
case ZBAR_SCANNER_REQUEST:
case ZBAR_QR_SCANNER_REQUEST:
在我的 ActivityResult 片段中,在 startActivityForResult 之后没有调用。因为我尝试了以下操作: 1) 添加 getParentFragment , getActivity before startActivityResult
2) 添加到清单 android:configChanges="orientation|screenSize"
3)onActivityResult is not being called in Fragment
4)检查ZbarScanner中的finish()方法Activity
Intent dataIntent = new Intent();
dataIntent.putExtra(SCAN_RESULT, symData);
dataIntent.putExtra(SCAN_RESULT_TYPE, sym.getType());
setResult(Activity.RESULT_OK, dataIntent);
finish();
5) 错误- [ResultInfo{who=null, request=196609, result=-1, data=Intent { (has extras) }}]} checked intent 的值不为空,我们正在传递
if (isCameraAvailable()) {
Intent intent = new Intent(this.getActivity(), ZBarScannerActivity.class);
intent.putExtra(ZBarConstants.SCAN_MODES, new int[]{Symbol.QRCODE});
startActivityForResult(intent, 1);
Toast.makeText(getActivity(), "inside case", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(getActivity(), "Rear Facing Camera Unavailable", Toast.LENGTH_SHORT).show();
}
----在Activity结果-----
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
Bundle bundle = data.getExtras();
switch (requestCode) {
case ZBAR_SCANNER_REQUEST:
case ZBAR_QR_SCANNER_REQUEST:
if (resultCode == getActivity().RESULT_OK) {
Toast.makeText(getActivity(), "Scan Result = " + data.getStringExtra(ZBarConstants.SCAN_RESULT), Toast.LENGTH_SHORT).show();
} else if (resultCode == getActivity().RESULT_CANCELED && data != null) {
String error = data.getStringExtra(ZBarConstants.ERROR_INFO);
if (!TextUtils.isEmpty(error)) {
Toast.makeText(getActivity(), error, Toast.LENGTH_SHORT).show();
}
}}
片段 onActivityResult
是一个非常常见且已知的问题。我已经用一种方法解决了,可能还有其他方法。
像这样从 Activity
移动到 Fragment
时设置标签。
fragmentManager.beginTransaction().replace(R.id.frame_container, fragment,"tag").commit();
现在在 Activity
的 onActivityResult
中编写以下代码。
if (requestCode == 1) { //set your requestcode whichever you are using
//super.onActivityResult(requestCode, resultCode, data);
//dont forget to comment this.
Fragment fragment = (Fragment) getSupportFragmentManager().findFragmentByTag("tag");
if(fragment != null){
fragment.onActivityResult(requestCode, resultCode, data);
}
}
我在片段中使用 FragmentPagerAdapter
时遇到了类似的问题。问题是我用片段的 FragmentManager
初始化了我的 PagerAdapter
,我替换了:
new MyPagerAdapter(getChildFragmentManager());
和
new MyPagerAdapter(getFragmentManager());
因此可能值得检查您使用的是哪个 FragmentManager。我对这种方法还不是 100% 满意,因为调用片段的 FragmentManager
似乎是正确的。但我还没有时间进一步检查它。
我在 MainActivity 上调用了 onActivityResult 并且它没有调用。所以删除了 switch case。它现在可以工作了
switch (requestCode) {
case ZBAR_SCANNER_REQUEST:
case ZBAR_QR_SCANNER_REQUEST: