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

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

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

поэтому я планирую использовать OnActivityResult().

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

}

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

пожалуйста, кто-нибудь дайте мне представление, как я могу достичь этого?

6 ответов


вам нужно действие для получения результата.

Если это только для организации кода, то вызовите другой класс из класса 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);
        ...
    }

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

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

intantiate его, чтобы вызвать startActivityForResult

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

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

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

pps: это старая школа java mouseListenerAdapter стиль ~Oo>


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


при запуске действия с помощью метода startActivityForResult из действия только вызывающий объект получит результат.

чтобы вы могли обработать результат и передать его задаче или обновить пользовательский интерфейс этого действия:

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

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

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

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


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

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

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