How to use onActivityResult method from other than Activity class

前端 未结 7 1214
鱼传尺愫
鱼传尺愫 2020-12-05 23:53

I am creating an app where i need to find current location of user .

So here I would like to do a task like when user returns from that System intent, my task shou

7条回答
  •  难免孤独
    2020-12-06 00:40

    You can't call this method out of his scope.

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

    If the method is protected like this case, you can see the table of Access Levels to know how to proceed.

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

    As you can see, this method only can be called from android.app.* package, Activity and their subclasses.


    SOLUTION:

    You need to do something like this:

    We have a class ImagePicker for selecting a image from Gallery or Camera or Delete it. This class need to call onActivityResult if user wants to delete image (We don't need to start an Activity for a result that we already know).

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

    For using this class in our Activity, we need to implement the delegate methods and pass our activity as the delegate of 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);
        }
    }
    

    Finally, we need to make thous delegate methods to be called, and that happen in show() and 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
        }
    }
    

    At the end, what we have, is a class that can call a method in your Activity instead of onActivityResult, but when you get a result in onActivityResult, you need to handle it in that class

提交回复
热议问题