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();

现在在 ActivityonActivityResult 中编写以下代码。

 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: