简体   繁体   English

onActivityResult不调用Fragment的

[英]onActivityResult not calling in Fragment's

Hi I am new for android and in my app I am using Z-bar library for scanning barcode. 嗨,我是Android新手,在我的应用程序中,我正在使用Z-bar库扫描条形码。

For this I am using ZbarScannerActivity class like below, so after scanning the barcode I am getting those barcode results where ever I want using onActivityResult method. 为此,我正在使用如下所示的ZbarScannerActivity类,因此在扫描条形码后,可以使用onActivityResult方法在需要的地方获取这些条形码结果。

Here my problem is when I am scanning the barcode I want to get this result in my Fragment, but here onActivityResult not calling in my Fragment. 这是我的问题,当我扫描条形码时,我想在我的片段中获取此结果,但是在这里onActivityResult没有调用我的片段。 But it's calling in my Activities please help me. 但是它正在呼唤我的活动,请帮助我。

How can I solve this problem? 我怎么解决这个问题?

ZbarScanner Activity:- ZbarScanner活动:-

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;
    }
}

my 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);
    }
}

Simple logic connected to general life 简单的逻辑连接到一般生活

activity : father(parent) 活动:父亲(父母)

fragment : child 片段:孩子

if child wanna money than he ask to him/ her father. 如果child想赚钱多于他向父亲/父亲求婚。

technical way if fragment(child) wanna data from onActivityResult it always VIA Activity(father) . 如果fragment(child)想要通过onActivityResult获取数据的技术方法,则it always VIA Activity(father)

ohk .. lets look on code side ohk ..让我们看看代码方面

stuff at 在的东西

yourActivity (Parent) yourActivity(父母)

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

this list of fragment(child) of activity said to him activity(father) for data 活动的片段(孩子)列表告诉他活动(父亲)的数据

when activity received data it gives as fragments(childs) demands. 当活动接收到数据时,它将作为碎片(子项)需求提供。

In fragment whenever we start activity for any result then that result in received in onActivityResult of activity then we have to pass this result to fragment's onActivityResult Write this to your activitys's onActivityResult 在片段中,无论何时我们为任何结果启动活动,然后在活动的onActivityResult中接收到该结果,然后我们都必须将此结果传递到片段的onActivityResult并将其写入活动的onActivityResult

  @Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    Logg.e("RESULT ", " " + resultCode);
    if (resultCode != RESULT_OK)
        return;
    switch (requestCode) {
        case 100:
            Fragment YourRfargment= getFragmentManager().findFragmentByTag("Your Fragment TAG");
            updateproFragment.onActivityResult(requestCode, resultCode, data);
            break;
          }    
     }

by this you will get your result in fragment's onActivityresult. 这样,您将在片段的onActivityresult中得到结果。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 超级OnActivityResult不调用Fragment OnActivityResult - Super OnActivityResult not calling Fragment OnActivityResult onActivityResult()未在片段中调用 - onActivityResult() is not calling in fragment 片段的onActivityResult不被调用 - Fragment's onActivityResult is not Called 嵌套片段的OnActivityResult没有调用 - OnActivityResult from nested fragment is not calling onActivityResult不是从选项卡片段调用 - onActivityResult is not calling from tab fragment 是否可以在片段中强制onActivityResult? - It's possible to force onActivityResult in fragment? Facebook callbackManager 方法 onActivityResult 未在 Fragment onActivityResult 方法中调用 - Facebook callbackManager method onActivityResult not calling in Fragment onActivityResult method 向后调用和onActivityResult()不在Fragment中调用,但在活动中调用 - Backward calls and onActivityResult() not calling in Fragment but calls in activity Facebook Android SDK:为什么在调用Fragment的onActivityResult之前重新创建Activity? - Facebook Android SDK: why is the Activity recreated before calling Fragment's onActivityResult? 片段的onActivityResult在方向更改后未调用 - Fragment's onActivityResult not called after orientation change
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM