Jay*_*yas 20 android android-activity onactivityresult
我正在创建一个应用程序,我需要找到用户的当前位置.
所以在这里我想做一个任务,比如当用户从那个系统意图返回时,我的任务应该在那之后完成.(显示用户当前位置)
所以我打算用OnActivityResult().
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
}
Run Code Online (Sandbox Code Playgroud)
但问题是我不知道如何在不扩展Activity的类中使用该方法.
请有人告诉我如何实现这一目标?
Yog*_*tia 12
您需要订单活动才能收到结果.
如果只是为了组织代码,那么从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);
...
}
Run Code Online (Sandbox Code Playgroud)
小智 6
在非Activity类中创建内部类,并在其中定义活动结果处理程序:
class singletonActivity extends Activity{
protected void onActivityResult(...){
// do whatever ..
}
}
Run Code Online (Sandbox Code Playgroud)
将其实例化以调用startActivityForResult
Activity actv = new singletonActivity(..)
actv.startActivityForResult(intent ..)
Run Code Online (Sandbox Code Playgroud)
你的处理程序将被调用.:)
ps:你可能需要包含一些覆盖.把它们留空
pps:这是老派java mouseListenerAdapter样式~o>
You can't call this method out of his scope.
protected void onActivityResult (int requestCode, int resultCode, Intent data)
Run Code Online (Sandbox Code Playgroud)
If the method is protected like this case, you can see the table of Access Levels to know how to proceed.
|-----------------------------------------------------------|
| 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 |
|------------------|---------|---------|----------|---------|
Run Code Online (Sandbox Code Playgroud)
As you can see, this method only can be called from android.app.* package, Activity and their subclasses.
SOLUTION:
You need to do something like this:
We have a class ImagePicker for selecting a image from Gallery or Camera or Delete it. This class need to call onActivityResult if user wants to delete image (We don't need to start an Activity for a result that we already know).
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();
}
}
Run Code Online (Sandbox Code Playgroud)
For using this class in our Activity, we need to implement the delegate methods and pass our activity as the delegate of 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);
}
}
Run Code Online (Sandbox Code Playgroud)
Finally, we need to make thous delegate methods to be called, and that happen in show() and 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
}
}
Run Code Online (Sandbox Code Playgroud)
At the end, what we have, is a class that can call a method in your Activity instead of onActivityResult, but when you get a result in onActivityResult, you need to handle it in that class
Jay*_*yas -3
最后我得到了我需要的东西以及这个问题的解决方案。
Activity con;
Intent intent_= new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
con.startActivityForResult(intent_, 0);
Run Code Online (Sandbox Code Playgroud)
现在我可以在这里创建一个方法,
public void startActivityForResult(Intent i, int code)
{
Log.e("", "insede method startActivityForResult()");
}
Run Code Online (Sandbox Code Playgroud)
通过使用此系统不会为我的意图创建子活动,因此仅在用户从意图返回后才会调用此方法。