如何使用 Activity 类以外的 onActivityResult 方法
Posted
技术标签:
【中文标题】如何使用 Activity 类以外的 onActivityResult 方法【英文标题】:How to use onActivityResult method from other than Activity class 【发布时间】:2014-03-13 20:48:13 【问题描述】:我正在创建一个应用程序,我需要在其中找到用户的当前位置。
所以在这里我想做一个任务,比如当用户从那个系统意图返回时,我的任务应该在那之后完成。(显示用户当前位置)
所以我打算使用OnActivityResult()
。
protected void onActivityResult(int requestCode, int resultCode, Intent data)
但问题是我不知道如何在不扩展 Activity 的类中使用该方法。
请有人告诉我如何实现这一目标?
【问题讨论】:
关注这个链接android-er.blogspot.in/2011/08/…它可能对你有帮助 您不能在其他类中调用该方法。您应该在活动中创建该类的实例并在那里调用处理方法。 您可以为此创建空白透明活动,并将结果从它的 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() 不会被调用。有人可以帮忙吗?以上是关于如何使用 Activity 类以外的 onActivityResult 方法的主要内容,如果未能解决你的问题,请参考以下文章
android 如何实现点击activity窗口以外的地方关闭或隐藏窗口?
从非 Fragment/Activity 类调用 registerForActivityResult