android - onActivityResult 未在 Fragment 中调用

标签 android android-fragments

嗨,我是 Android 新手,在我的应用程序中,我使用 Z-bar 库来扫描条形码。

为此,我使用如下所示的 ZbarScannerActivity 类,因此在扫描条形码后,我可以使用 onActivityResult 方法在任何我想要的地方获得这些条形码结果。

这里我的问题是,当我扫描条形码时,我想在我的 fragment 中得到这个结果,但是这里的 onActivityResult 没有在我的 fragment 中调用。 但它正在调用我的 Activity ,请帮助我。

如何解决这个问题?

ZbarScanner Activity :-

public class ZBarScannerActivity extends ActionBarActivity {

    private Camera mCamera;
    private CameraPreview mPreview;
    private Handler autoFocusHandler;
    ImageScanner scanner;
    ImageView backButton;
    private boolean barcodeScanned = false;
    private boolean previewing = true;
    CustomTextview navigation_title;

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_scanner_view_layout);
        ActionBar actionBar = getSupportActionBar();
        String header = "<font color=\"#ffffff\">" + "BarCode Scanner"
                + " </font>";
        CommonUtils.actionbarHeader(this, actionBar, header);
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

        autoFocusHandler = new Handler();
        mCamera = getCameraInstance();

        /* Instance barcode scanner */
        scanner = new ImageScanner();
        scanner.setConfig(0, Config.X_DENSITY, 3);
        scanner.setConfig(0, Config.Y_DENSITY, 3);

        mPreview = new CameraPreview(this, mCamera, previewCb, autoFocusCB);
        FrameLayout preview = (FrameLayout) findViewById(R.id.cameraPreview);
        preview.addView(mPreview);

        navigation_title = (CustomTextview)findViewById(R.id.navigationTitle_id);
        navigation_title.setText("Barcode Scanner");

        backButton = (ImageView)findViewById(R.id.navigationbackbutton_id);
        backButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                finish();
            }
        });
    }

    static {

        System.loadLibrary("iconv");
    }

    public void onPause() {
        super.onPause();
        releaseCamera();
    }

    /** A safe way to get an instance of the Camera object. */
    public static Camera getCameraInstance() {
        Camera c = null;
        try {
            c = Camera.open();
        } catch (Exception e) {
        }
        return c;
    }

    private void releaseCamera() {
        if (mCamera != null) {
            previewing = false;
            mCamera.setPreviewCallback(null);
            mCamera.release();
            mCamera = null;
        }
    }

    private Runnable doAutoFocus = new Runnable() {
        public void run() {
            if (previewing)
                mCamera.autoFocus(autoFocusCB);
        }
    };

    PreviewCallback previewCb = new PreviewCallback() {

        public void onPreviewFrame(byte[] data, Camera camera) {
            Camera.Parameters parameters = camera.getParameters();
            Size size = parameters.getPreviewSize();

            Image barcode = new Image(size.width, size.height, "Y800");
            barcode.setData(data);

            int result = scanner.scanImage(barcode);

            if (result != 0) {
                previewing = false;
                mCamera.setPreviewCallback(null);
                mCamera.stopPreview();

                SymbolSet syms = scanner.getResults();
                for (Symbol sym : syms) {

                    System.out.println("------->"+sym.getData());
                    barcodeScanned = true;
                    finishActivivtyWithResult(sym.getData());
                }
            }
        }
    };

    // Mimic continuous auto-focusing
    AutoFocusCallback autoFocusCB = new AutoFocusCallback() {
        public void onAutoFocus(boolean success, Camera camera) {
            autoFocusHandler.postDelayed(doAutoFocus, 1000);
        }
    };

    /**
     *
     * @param barCodeResult
     */
    private void finishActivivtyWithResult(String barCodeResult){

        if (barCodeResult.contains("//b")) {

            String replacedString = barCodeResult.replace("//b", "");
            System.out.println("One========>" + replacedString);
            barCodeResult = replacedString;
        }
        if (barCodeResult.contains("/t")) {

            String replacedString = barCodeResult.replace("/t", "-");
            System.out.println("After========>" + replacedString);
            barCodeResult = replacedString;
        }

        Bundle conData = new Bundle();
        conData.putString("barCodeResult", barCodeResult);
        Intent intent = new Intent();
        intent.putExtras(conData);
        setResult(RESULT_OK, intent);
        finish();
    }

    @Override
    public boolean onSupportNavigateUp() {

        finish();
        return true;
    }
}

我的 fragment :-

 //Camera Button Action Event:-

    /**
     * @return
     */
    private View.OnClickListener cameraDetails() {

        return new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                BAR_CODE_SCANNER_CODE = 100;
                checkCameraPermission();

            }
        };
    }

    //BarCode Scanner Result:-

    private void checkCameraPermission() {

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {

            checkManifestPermissionSets();
        } else {

            scanProductCode();
        }
    }

    @TargetApi(23)
    private void checkManifestPermissionSets() {

        int cameraPermission = ContextCompat.checkSelfPermission(getActivity(),
                Manifest.permission.CAMERA);

        List<String> permissions = new ArrayList<String>();

        if (cameraPermission != PackageManager.PERMISSION_GRANTED) {
            permissions.add(Manifest.permission.CAMERA);
        }

        if (!permissions.isEmpty()) {
            requestPermissions(
                    permissions.toArray(new String[permissions.size()]),
                    REQUEST_CODE_SOME_FEATURES_PERMISSIONS);

        } else {

            scanProductCode();
        }
    }


    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        switch (requestCode) {

            case REQUEST_CODE_SOME_FEATURES_PERMISSIONS: {

                for (int i = 0; i < permissions.length; i++) {
                    if (grantResults[i] == PackageManager.PERMISSION_GRANTED) {
                        //Log.d("Permissions", "Permission Granted: "+ permissions[i]);
                        scanProductCode();
                        break;
                    } else if (grantResults[i] == PackageManager.PERMISSION_DENIED) {

                        //Log.d("Permissions", "Permission Denied: " + permissions[i]);
                        //CommonUtils.showToastMessage(StockTransfer.this, "You've disabled the App required Permissions");
                        break;
                    }
                }
            }

            break;
            default: {
                super.onRequestPermissionsResult(requestCode, permissions,
                        grantResults);
            }
        }
    }


    private void scanProductCode() {

        if (isCameraAvailable()) {

            CommonUtils.showToastMessage(getActivity(),
                    "Please Scan Your Product BarCode");

            callThreadScannerActivity();

        } else {
            Toast.makeText(getActivity(), "Rear Facing Camera Unavailable",
                    Toast.LENGTH_SHORT).show();
        }
    }

    private void callThreadScannerActivity() {

        Handler handler = new Handler();
        handler.postDelayed(new Runnable() {
            @Override
            public void run() {
                // dialog.dismiss();
                callScannerActivity();
            }
        }, 700);
    }


    // Call Scanner Activity:-

    private void callScannerActivity() {

        Intent intent = new Intent(getActivity(), ZBarScannerActivity.class);
        startActivityForResult(intent, BAR_CODE_SCANNER_CODE);
    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {

        System.out.println("result code------>" + requestCode);
    }

    private boolean isCameraAvailable() {

        PackageManager pm = getActivity().getPackageManager();
        return pm.hasSystemFeature(PackageManager.FEATURE_CAMERA);
    }
}

最佳答案

与日常生活相关的简单逻辑

activity : father(parent)

fragment : child

如果 child 想要钱,就向他/她的父亲要钱。

如果 fragment (子)想要从 onActivityResult 获取数据,技术方法它总是通过 Activity(父亲)

ohk ..让我们看看代码方面

东西在

yourActivity (Parent)

 @Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    try {

        List<Fragment> fragments = getSupportFragmentManager().getFragments();
        if (fragments != null) {
            for (Fragment fragment : fragments) {
                fragment.onActivityResult(requestCode, resultCode, data);
            }
        }

    } catch (Exception e) {
        e.printStackTrace();
    }
}

此 Activity fragment (子)列表向他的 Activity (父亲)表示数据

当 Activity 收到数据时,它会按照 fragment (子级)的要求提供。

关于android - onActivityResult 未在 Fragment 中调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38092761/

相关文章:

Android - 如何直接转到返回堆栈中的上一个 Activity 并忽略 fragment 返回堆栈或当前 Activity 中的剩余 fragment ?

android-wear\x86\devices.xml cvc-complex-type.2.4.d : Invalid content was found 'd:skin' . 此时预计没有子元素

java - 如何从单独的线程更新 UI 线程而不阻塞它?

java - 调整 Fragment 中 TextView 的文本大小

android - 在 EditText 中添加多个可绘制对象

android,videoView打不开这个视频在线视频

android - XML 文件无法解析或不是字段

Android 从存储在 JSONObject 中的 URL 获取图像

Android 应用程序离线同步到 Azure SQL Server 和 Blob 存储

android - 当可见性设置为不可见时,横幅广告未加载