web-dev-qa-db-ja.com

フラグメントのonActivityResultから結果を取得する方法

利用した Navigation drawer各アイテムをクリックしてFragmentsを呼び出したため、1つのアイテムでこのフラグメントのFragmentを呼び出しました。カメラから画像を取得し、canvas background。これでカメラの画像をキャプチャしましたが、キャプチャ後にこの画像を取得してキャンバスの背景に設定する方法がわかりません。

フラグメントコード

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

}
17
Hiren Vaghela

アクティビティクラス:

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

    super.onActivityResult(requestCode,resultCode,data);

}
_

フラグメント内:

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

オプション1 :

フラグメントからstartActivityForResult()を呼び出す場合は、startActivityForResult()ではなくgetActivity().startActivityForResult()を呼び出す必要があります。フラグメントonActivityResult()が生成されるためです。

startActivityForResult()でどこを呼び出しているのか、メソッドをどのように呼び出すのかわからない場合。

オプション2:

ActivityはonActivityResult()の結果を取得するため、アクティビティのonActivityResult()をオーバーライドし、super.onActivityResult()を呼び出して、未処理の結果コードまたはすべての個々のフラグメントに伝播する必要があります。

上記の2つのオプションが機能しない場合は、確実に機能するため、オプション3を参照してください。

オプション3:

次のように、フラグメントからonActivityResult関数への明示的な呼び出し

Parent Activityクラスでは、onActivityResult()メソッドをオーバーライドし、Fragment Classで同じものをオーバーライドして、次のコードとして呼び出します。

活動中:

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

フラグメント内:

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

交換

getActivity().startActivityForResult(intent, CAMERA_DATA);

startActivityForResult(intent, CAMERA_DATA);
4
Ramesh

onActivityResultはActivityに実装する必要があります。このクラスはフラグメントです。
Apply onActivityResult FragmentActivity内。

0