web-dev-qa-db-fra.com

comment obtenir le résultat de onActivityResult in Fragment?

J'ai utilisé Navigation drawer dans chaque élément, j'ai appelé Fragments, de sorte que dans un élément, j'ai appelé une Fragment dans ce fragment, j'ai besoin d'obtenir une image de l'appareil photo et de la définir comme canvas background. J'ai capturé cette image mais je ne sais pas comment obtenir cette image après l'avoir capturée et la définir sur l'arrière-plan de la toile.

Code de fragment

import Android.content.ContentValues;
import Android.content.Context;
import Android.content.Intent;
import Android.graphics.Bitmap;
import Android.graphics.BitmapFactory;
import Android.graphics.Canvas;
import Android.graphics.Color;
import Android.graphics.Paint;
import Android.net.Uri;
import Android.os.Build;
import Android.os.Bundle;
import Android.os.Environment;
import Android.provider.MediaStore;
import Android.support.v4.app.Fragment;
import Android.util.DisplayMetrics;
import Android.util.Log;
import Android.view.LayoutInflater;
import Android.view.MotionEvent;
import Android.view.View;
import Android.view.ViewGroup;
import Android.widget.Button;
import Android.widget.ImageButton;
import Android.widget.LinearLayout;
import Android.widget.Toast;

import com.ssoft.admin.code.SharedPreferenceStore;
import com.ssoft.admin.code.Tools;
import com.ssoft.admin.salesmateco.FragSiteInspectionAdditional;
import com.ssoft.admin.salesmateco.R;

import Java.io.BufferedInputStream;
import Java.io.File;
import Java.io.FileInputStream;
import Java.io.FileNotFoundException;
import Java.io.FileOutputStream;
import Java.io.IOException;
import Java.util.ArrayList;
import Java.util.List;
public class FragSignature extends Fragment implements View.OnClickListener {
    Button mSIBtnCamera;
    Fragment fragment;
    Tools mTools;
    private static final int RESULT_OK = 1;
    private static final int RESULT_CANCELED = 0;
    Uri imageUri = null;
    final int CAMERA_DATA = 100, INTENT_DATA = 1;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View rootView = inflater.inflate(
                R.layout.frag_site_inspection_signature, null);
        mSIBtnCamera = (Button) rootView.findViewById(R.id.camera);
        mSIBtnCamera.setOnClickListener(this);

        return rootView;
    }

    @Override
    public void onClick(View v) {
        if (v.getId() == R.id.camera) {
            captureImage();
        }

        else {
            Toast.makeText(getActivity().getApplicationContext(),
                    "FragSIPhotos Add Button OnClick", Toast.LENGTH_SHORT)
                    .show();

        }
    }

    public void captureImage() {
        // Define the file-name to save photo taken by Camera activity

        String fileName = "Images.jpg";

        // Create parameters for Intent with filename

        ContentValues values = new ContentValues();

        values.put(MediaStore.Images.Media.TITLE, fileName);

        values.put(MediaStore.Images.Media.DESCRIPTION,
                "Image capture by camera");

        // imageUri is the current activity attribute, define and save it for
        // later usage

        Uri imageUri = getActivity().getApplicationContext()
                .getContentResolver()
                .insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);

        /****
         * EXTERNAL_CONTENT_URI : style URI for the "primary" external storage
         * volume.
         ****/

        // Standard Intent action that can be sent to have the camera
        // application capture an image and return it.

        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

        intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);

        intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, INTENT_DATA);
        Log.e("captureImage()", "state -1");
        getActivity().startActivityForResult(intent, CAMERA_DATA);
        Log.e("captureImage()", "end");

    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        Log.e("OnActivityResult()", "1");

        if (requestCode == CAMERA_DATA) {
            Log.e("OnActivityResult()", "2");

            if (resultCode == RESULT_OK) {
                // Image captured and saved to fileUri specified in the Intent
                Log.e("OnActivityResult()", "3");
            } else if (resultCode == RESULT_CANCELED) {
                // User cancelled the image capture
                Log.e("OnActivityResult()", "4");
            } else {
                // Image capture failed, advise user
                Log.e("OnActivityResult()", "5");
            }
        }
        Log.e("OnActivityResult()", "6");
        super.onActivityResult(requestCode, resultCode, data);
        Log.e("OnActivityResult()", "7");
    }

}
13
Hiren Vaghela

En classe d'activité:  

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

    super.onActivityResult(requestCode,resultCode,data);

}

En fragment:

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

Option 1 :

Si vous appelez startActivityForResult() à partir du fragment, vous devez appeler startActivityForResult() et non pas getActivity().startActivityForResult(), car cela entraînerait la fragmentation onActivityResult().

Si vous ne savez pas où vous appelez sur startActivityForResult() et comment vous allez appeler des méthodes.

Option 2:

Puisque Activity obtient le résultat de onActivityResult(), vous devez remplacer le onActivityResult() de l'activité et appeler super.onActivityResult() pour le propager au fragment respectif pour les codes de résultat non gérés ou pour tous.

Si plus de 2 options ne fonctionnent pas, référez-vous à l'option 3, elle fonctionnera certainement.

Option 3:

Appel explicite d'un fragment à la fonction onActivityResult comme suit

Dans la classe Parent Activity, substituez la méthode onActivityResult() et même la même chose dans Fragment Class et appelez-la comme code suivant.

En activité:

@Override
 protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
Fragment fragment = getSupportFragmentManager().findFragmentById("yourFragment"); 
fragment.onActivityResult(requestCode, resultCode, data); 
}

En fragment:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
   //in fragment class callback
}
31
Arslan Sohail

Remplacer

getActivity().startActivityForResult(intent, CAMERA_DATA);

avec

startActivityForResult(intent, CAMERA_DATA);
4
Ramesh

onActivityResult devrait être implémenté dans Activity, cette classe est votre fragment.
Appliquer onActivityResult à l’intérieur de FragmentActivity.

0
Bhavana Vadodariya