Подтвердить что ты не робот

Как использовать метод onActivityResult из класса Activity

Я создаю приложение, где мне нужно найти текущее местоположение пользователя.

Итак, здесь я хотел бы выполнить задачу, например, когда пользователь вернется из этой системы, моя задача должна быть выполнена после этого. (Отображение текущего местоположения пользователей)

Итак, я планирую использовать OnActivityResult().

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

}

Но проблема в том, что я не знаю, как использовать этот метод в классе, который не расширяет Activity.

Прошу, чтобы кто-нибудь дал мне идею, как я могу это достичь?

4b9b3361

Ответ 1

Наконец, я получил то, что мне нужно, а также решение для этого вопроса.

 Activity con;
Intent intent_= new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
            con.startActivityForResult(intent_, 0);

Теперь я могу создать метод здесь,

public void startActivityForResult(Intent i, int code)
{
    Log.e("", "insede method startActivityForResult()");
}

При использовании этой системы не создается суб-активность для моего намерения, поэтому этот метод вызывается только после возврата пользователя из намерения.

Ответ 2

Для получения результата вам потребуется операция.

Если его только для организации кода, то вызовите другой класс из класса Activty.

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

Ответ 3

Создайте внутренний класс в классе non Activity и определите в нем обработчик результатов деятельности:

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

intantiate его для вызова startActivityForResult

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

будет вызываться ваш обработчик. :)

ps: вам может потребоваться включить некоторые переопределения. просто оставьте их пустыми.

pps: это старая школа java mouseListenerAdapter style ~ Оо >

Ответ 4

Вы не можете вызывать этот метод из своего объема.

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

Если этот метод защищен, как этот случай, вы можете увидеть таблицу уровней доступа, чтобы знать, как действовать.

|-----------------------------------------------------------|
|                     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 и их подклассов.


РЕШЕНИЕ:

Вам нужно сделать что-то вроде этого:

У нас есть класс 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);
    }
}

Наконец, нам нужно вызвать тысячи методов делегатов, и это произойдет в 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

Ответ 5

Вам нужно зарегистрировать Activity для этого класса, а затем использовать OnActivityResult() для этого действия.

Ответ 6

Когда вы запускаете действие с помощью метода 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);
     }
}

Ответ 7

Я использую это так, это может быть полезно для других

В моем фрагменте у меня есть

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