Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/195.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何使用非活动类的onActivityResult方法_Android_Android Activity_Onactivityresult - Fatal编程技术网

Android 如何使用非活动类的onActivityResult方法

Android 如何使用非活动类的onActivityResult方法,android,android-activity,onactivityresult,Android,Android Activity,Onactivityresult,我正在创建一个应用程序,需要在其中查找用户的当前位置 所以这里我想做一个任务,比如当用户从那个系统返回时,我的任务应该在那个之后完成。(显示用户当前位置) 因此,我计划在ActivityResult()上使用 但问题是,我不知道如何在一个不扩展活动的类中使用该方法 请有人告诉我如何才能做到这一点?您需要一项活动才能收到结果 如果只是为了组织代码,那么从Activty类调用其他类 public class Result { public static void activityResult

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

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

因此,我计划在ActivityResult()上使用

但问题是,我不知道如何在一个不扩展活动的类中使用该方法


请有人告诉我如何才能做到这一点?

您需要一项活动才能收到结果

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

您需要将
活动注册到此类,然后对该活动使用
OnActivityResult()

当您使用
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);
     }
}

最后我得到了我所需要的,也是这个问题的解决方案

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

使用此系统不会为my intent创建子活动,因此,只有在用户从intent返回后才会调用此方法。

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

class singletonActivity extends Activity{
  protected void onActivityResult(...){
    // do whatever ..
  }
}
将其命名为startActivityForResult

Activity actv = new singletonActivity(..)
actv.startActivityForResult(intent ..)
您的处理程序将被调用。 :)

ps:您可能需要包括一些覆盖。就让它们空着吧

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

您不能在他的范围之外调用此方法。

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.*
package、
Activity
及其子类调用


解决方案:

您需要这样做:

我们有一个类
ImagePicker
,用于从图库相机删除中选择图像。如果用户想要删除图像,这个类需要调用
onActivityResult
(对于我们已经知道的结果,我们不需要启动
活动)

为了在我们的
活动中使用此类
,我们需要实现委托方法并将我们的活动作为
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)
中调用数千个委托方法:


最后,我们得到的是一个
,它可以在你的
活动
中调用一个方法,而不是
onActivityResult
,但是当你在
onActivityResult
中得到一个结果时,你需要在
中处理它。我正在这样使用它,这可能对其他人有帮助

在我的片段中我有

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

遵循此链接可能有助于您在其他类中无法调用该方法。您应该在活动中创建该类的实例,并在那里调用处理方法。您可以为此创建空白的透明活动,并将结果从onActivityResult()返回到您的任务。您从何处调用它?我无法理解您的逻辑。你能给我一个演示吗?我正在做一些类似的事情,只是为了组织Facebook登录的代码,但是在成功登录尝试后,片段中的onActivityResult()没有被调用。有人能帮忙吗?onActivityResult方法在哪里?这似乎是一个未完成的代码。从您的问题可以理解为您需要“OnActivityResult”方法,它在您的答案中的位置?这是对这个问题以及所有类似问题的正确答案。它应该有更多的投票权。好主意,我在做某个第三方项目,在那里我无法访问主要项目代码。您的回答可能会解决我的问题。这会导致一个错误
无法找到显式活动类{…}。您是否在AndroidManifest.xml中声明了此活动?
。如何将其添加到AndroidManifest.xml?
// 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;
    }
}