web-dev-qa-db-ja.com

Activityクラス以外からのonActivityResultメソッドの使用方法

ユーザーの現在の場所を見つける必要があるアプリを作成しています。

したがって、ここでは、ユーザーがそのシステムインテントから戻ったときのようなタスクを実行したいのですが、その後、私のタスクを実行する必要があります(ユーザーの現在の場所の表示)

だから私はOnActivityResult()を使うつもりです。

protected void onActivityResult(int requestCode, int resultCode, Intent data) {

}

しかし問題は、Activityを拡張していないクラスでそのメソッドをどのように使用できるかわからないことです。

誰かが私にこれをどのように達成できるか考えてください?

20
Jay Vyas

結果を受け取るには、アクティビティが必要です。

コードを整理するだけの場合は、Activityクラスから別のクラスを呼び出します。

public class Result {
    public static void activityResult(int requestCode, int resultCode, Intent data){
          ...
   }
}


@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
       Result.activityResult(requestCode,resultCode,data);
        ...
    }
12
Yogesh Lakhotia

非Activityクラスに内部クラスを作成し、その中にアクティビティ結果ハンドラーを定義します。

class singletonActivity extends Activity{
  protected void onActivityResult(...){
    // do whatever ..
  }
}

startActivityForResultを呼び出すようにインスタンス化する

Activity actv = new singletonActivity(..)
actv.startActivityForResult(intent ..)

ハンドラが呼び出されます。 :)

pS:いくつかのオーバーライドを含める必要があるかもしれません。空のままにしておきます。

pps:これは古い学校ですJava mouseListenerAdapter style〜Oo>

6
user1135300

このメソッドを彼のスコープ外で呼び出すことはできません。

_protected void onActivityResult (int requestCode, int resultCode, Intent data)
_

この方法のようにメソッドがprotectedである場合、-Access Levelsの表を参照して続行方法を確認できます。

_|-----------------------------------------------------------|
|                     ACCESS LEVELS                         |
|------------------|---------|---------|----------|---------|
|      Modifier    |  Class  | Package | Subclass |  World  |
|------------------|---------|---------|----------|---------|
|      public      |    Y    |    Y    |    Y     |    Y    |
|------------------|---------|---------|----------|---------|
|      protected   |    Y    |    Y    |    Y     |    N    |
|------------------|---------|---------|----------|---------|
|      no modifier |    Y    |    Y    |    N     |    N    |
|------------------|---------|---------|----------|---------|
|      private     |    Y    |    N    |    N     |    N    |
|------------------|---------|---------|----------|---------|
_

ご覧のとおり、このメソッドは_Android.app.*_パッケージ、Activity、およびそれらのサブクラスからのみ呼び出すことができます。


解決策:

あなたはこのようなことをする必要があります:

GalleryまたはCameraまたはDeleteから画像を選択するためのImagePickerクラスがあります。ユーザーが画像を削除したい場合、このクラスはonActivityResultを呼び出す必要があります(すでにわかっている結果を得るためにActivityを開始する必要はありません)。

_public class ImagePicker {
    private ImagePickerDelegate delegate;

    public ImagePicker (ImagePickerDelegate delegate) {
        this.delegate = delegate;
    }

    //Will explain this two methods later
    public void show() {
        //Some code to show AlertDialog
    }

    public void handleResponse(Intent data) {
        //Some code to handle onActivityResult
    }

    //Our interface to delegate some behavior 
    public interface ImagePickerDelegate {
        void onImageHandled(Bitmap image);
        void onImageError();
        void onImageDeleted();
    }
}
_

このクラスをActivityで使用するには、デリゲートメソッドを実装し、アクティビティをImagePickerのデリゲートとして渡す必要があります。

_public class MyActivity extends Activity implements ImagePicker.ImagePickerDelegate {
    ImagePicker imagePicker;    

    @OnClick(R.id.image_edit)
    public void selectImage () {
        imagePicker = new ImagePicker(this);
        imagePicker.show();
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode == ImagePicker.REQUEST_IMAGE_PICKER && resultCode == RESULT_OK) {
            imagePicker.handleResponse(data);
        }
        super.onActivityResult(requestCode, resultCode, data);
    }

    @Override
    public void onImageHandled(Bitmap image) {
        //handle image resized
        imageView.setImageBitmap(image);
    }

    @Override
    public void onImageError() {
        //handle image error
        Toast.makeText(this, "Whoops - unexpected error!", Toast.LENGTH_SHORT).show();
    }

    @Override
    public void onImageDeleted() {
        //handle image deleted
        groupImageView.setImageBitmap(null);
        groupImageView.setImageResource(R.drawable.ic_pick_picture);
    }
}
_

最後に、30個のデリゲートメソッドを呼び出す必要があります。これはshow()handleResponse(Intent data)で行われます。

_//The show method create and dialog with 3 options,
//the important thing here, is when an option is selected
public void show() {
    //Inflating some views and creating dialog...

    NavigationView navView = (NavigationView)viewInflated.findViewById(R.id.navigation_menu);
    navView.setNavigationItemSelectedListener( new NavigationView.OnNavigationItemSelectedListener() {
        @Override
        public boolean onNavigationItemSelected(MenuItem menuItem) {
            switch (menuItem.getItemId()) {
                case R.id.action_select_image:
                    Intent pickPhoto = new Intent(Intent.ACTION_PICK, Android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
                    activity.startActivityForResult(pickPhoto , REQUEST_IMAGE_PICKER);
                    break;
                case R.id.action_take_picture:
                    Intent takePicture = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                    activity.startActivityForResult(takePicture, REQUEST_IMAGE_PICKER);
                    break;
                case R.id.action_delete_image:
                    delegate.onImageDeleted(); //send response to activity
                    break;
            }
            alertDialog.dismiss();
            return true;
        }
    });

    //Show dialog...
}


//this method is called from onActivityResult
public void handleResponse(Intent data) {
    try {
        //Retrieve and resize image...
        delegate.onImageHandled(image); //send the image to activity
    } catch (Exception e) {
        e.printStackTrace();
        delegate.onImageError(); //send error to activity
    }
}
_

最後に、classではなくActivity内のメソッドを呼び出すことができるonActivityResultがありますが、onActivityResultで結果を取得するときは、そのclassで処理する必要があります

3
IgniteCoders

このクラスにActivityを登録してから、そのアクティビティにOnActivityResult()を使用する必要があります。

1
Ameer Moaaviah

アクティビティからstartActivityForResultメソッドを使用してアクティビティを開始すると、呼び出し元のみが結果を受け取ります。

したがって、結果を処理してタスクに渡すか、そのアクティビティのUIを更新できます。

int MY_REQUEST_ID = 1;

public void onClick(){
    //Select a contact.
    startActivityForResult(
             new Intent(Intent.ACTION_PICK,
             new Uri("content://contacts")),
             MY_REQUEST_ID);
}    

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
     if(requestCose == MY_REQUEST_ID && resultCode == SUCCESS) {
         MyAsyncTask task = new AsyncTask(requestCode, resultCode, data);
         task.execute();
         // or update the UI
         textView.setText("Hi, activity result: "+ resultCode);
     }
}
1
Manuel Spigolon

私はこのように使用していますこれは他の人に役立つかもしれません

私のフラグメントでは

// Upload Cover Photo On Button Click
btn.setOnClickListener(new View.OnClickListener() {

    @Override
    public void onClick(View v) {

        // Start The Image Cropper And Go To onActivityResult
        Intent intent = ImageManager.startImageCropper(getContext());
        startActivityForResult(intent, CropImage.CROP_IMAGE_ACTIVITY_REQUEST_CODE);

    }
});

次に、フラグメントでこのような結果を呼び出します

// On Activity Result for Start Activity For Result
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {

    super.onActivityResult(requestCode, resultCode, data);

    // Get The Image From Image Cropper
    Uri resultUri = ImageManager.activityResult(requestCode, resultCode, data, getContext());
}

これらをサポートするパブリッククラス/関数は

public class ImageManager {

    // Start Image Cropper
    public static Intent startImageCropper(Context context) {

        // Crop Image
        Intent intent = CropImage.activity()
                .setGuidelines(CropImageView.Guidelines.ON)
                .setActivityTitle("Title")
                .setCropMenuCropButtonTitle("Save")
                .setAutoZoomEnabled(true)
                .setAspectRatio(1, 1)
                .getIntent(context);

        return intent;

    }

    public static Uri activityResult(int requestCode, int resultCode, Intent data, Context context) {

        // Handle Cropped Image

        Uri resultUri = null;

        if (requestCode == CropImage.CROP_IMAGE_ACTIVITY_REQUEST_CODE) {
            CropImage.ActivityResult result = CropImage.getActivityResult(data);
            if (resultCode == Activity.RESULT_OK) {
                resultUri = result.getUri();

            } else if (resultCode == CropImage.CROP_IMAGE_ACTIVITY_RESULT_ERROR_CODE) {
                Exception error = result.getError();
                Toast.makeText(context, (CharSequence) error, Toast.LENGTH_SHORT).show();
            }

        }
        return resultUri;
    }
}
0
DragonFire