【问题标题】:How to use onActivityResult method from other than Activity class如何使用 Activity 类以外的 onActivityResult 方法
【发布时间】:2014-03-13 20:48:13
【问题描述】:

我正在创建一个应用程序,我需要在其中找到用户的当前位置。

所以在这里我想做一个任务,比如当用户从那个系统意图返回时,我的任务应该在那之后完成。(显示用户当前位置)

所以我打算使用OnActivityResult()

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

}

但问题是我不知道如何在不扩展 Activity 的类中使用该方法。

请有人告诉我如何实现这一目标?

【问题讨论】:

  • 关注这个链接android-er.blogspot.in/2011/08/…它可能对你有帮助
  • 您不能在其他类中调用该方法。您应该在活动中创建该类的实例并在那里调用处理方法。
  • 您可以为此创建空白透明活动,并将结果从它的 onActivityResult() 返回到您的任务。
  • 你在哪里打电话??

标签: android android-activity onactivityresult


【解决方案1】:

当您从activity 使用startActivityForResult 方法启动activity 时,只有调用者会收到结果。

因此您可以处理结果并将其传递给任务或更新 activity 的 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);
     }
}

【讨论】:

    【解决方案2】:

    我正在这样使用它,这可能对其他人有帮助

    在我的片段中

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

    【讨论】:

      【解决方案3】:

      你不能在他的范围之外调用这个方法。

      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

      【讨论】:

      • 这是对这个问题以及关于 SO 的所有类似问题的正确答案。它应该有更多的赞成票。
      【解决方案4】:

      在非 Activity 类中创建一个内部类,并在其中定义您的活动结果处理程序:

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

      实例化它来调用 startActivityForResult

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

      您的处理程序将被调用。 :)

      ps:您可能必须包含一些覆盖。把它们留空。

      pps:这是老式的 java mouseListenerAdapter 风格 ~哦>

      【讨论】:

      • 好主意,我正在处理一些第三方项目,我无法访问主项目代码。你的回答可能会解决我的问题。
      • 这给出了一个错误Unable to find explicit activity class {...} have you declared this activity in your AndroidManifest.xml?。这应该如何添加到 AndroidManifest.xml 中?
      【解决方案5】:

      我终于得到了我需要的东西以及这个问题的解决方案。

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

      通过使用这个系统并没有为我的意图创建一个子活动,所以这个方法只有在用户从意图返回后才会被调用。

      【讨论】:

      • onActivityResult 方法在哪里?
      • 这似乎是一个未完成的代码。从您的问题可以理解,您需要“OnActivityResult”方法,您的答案在哪里?
      【解决方案6】:

      您需要向此类注册Activity,然后为该活动使用OnActivityResult()

      【讨论】:

        【解决方案7】:

        您需要一个 Activity 才能收到结果。

        如果它只是为了组织代码,那么从 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);
                ...
            }
        

        【讨论】:

        • 我无法理解你的逻辑。你会为此做一个演示吗
        • 我正在做类似的事情,只是为了组织 Facebook 登录的代码,但在成功登录尝试后,片段中的 onActivityResult() 不会被调用。有人可以帮忙吗?
        猜你喜欢
        • 2020-02-26
        • 2016-12-08
        • 1970-01-01
        • 2019-08-23
        • 1970-01-01
        • 2014-07-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多