从非 activity class 调用 startActivityForResult() 并在现有 activity 或片段中获取结果
call to startActivityForResult() from non activity class and getting result in existing activity or fragment
我的 IntentHelper class 是
public class IntentHelper {
private Activity activity;
// Camera activity request code
public static final int CAMERA_CAPTURE_IMAGE_REQUEST_CODE = 100;
//Gallery activity request code
public static final int GALLERY_OPEN_IMAGE_REQUEST_CODE = 101;
public IntentHelper(Activity activity){
this.activity = activity;
}
/**
* Launching gallery to get image
*/
public void getGalleryImage(){
Intent intent = new Intent();
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
intent.putExtra("aspectX", 1);
intent.putExtra("aspectY", 1);
intent.putExtra("scale", true);
intent.putExtra("outputFormat",
Bitmap.CompressFormat.JPEG.toString());
activity.startActivityForResult(Intent.createChooser(intent, "Select Image"),GALLERY_OPEN_IMAGE_REQUEST_CODE);
}
}
我将片段中的 class 称为:
IntentHelper intentHelper = new IntentHelper(getActivity());
intentHelper.getGalleryImage();
按照这个逻辑,我的图库意图已经成功打开。
但是:
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
// following if condition is not executing
if(requestCode == IntentHelper.GALLERY_OPEN_IMAGE_REQUEST_CODE)
{
if(resultCode == RESULT_OK){
SnackbarHelper.showSnackBar("Image browsed sucessfully",getView());
Toast.makeText(getContext(), "Image browsed successfully", Toast.LENGTH_SHORT).show();
}
else if(requestCode == RESULT_CANCELED){
SnackbarHelper.showSnackBar("Image browsed cancelled",getView());
}
}
}
我不知道为什么会这样。
我的意图被完美地调用并且让我返回相同的 activity 那为什么这个 onActivityResult() 条件不起作用???
My all code is in fragment. But I don't think so it cause this problem
编辑 - 解决方案
因为@laalto 给出的答案是正确的。我必须使用片段实例启动 startActivityForResult() 。
因此我将 IntentHelper class 更改为:
public class IntentHelper {
/*
* Instead of Activity use Fragment
*/
private Fragment fragment;
// Camera activity request code
public static final int CAMERA_CAPTURE_IMAGE_REQUEST_CODE = 100;
//Gallery activity request code
public static final int GALLERY_OPEN_IMAGE_REQUEST_CODE = 101;
public IntentHelper(Fragment fragment){
this.fragment = fragment;
}
/**
* Launching gallery to get image
*/
public void getGalleryImage() {
Intent intent = new Intent();
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
intent.putExtra("aspectX", 1);
intent.putExtra("aspectY", 1);
intent.putExtra("scale", true);
intent.putExtra("outputFormat",
Bitmap.CompressFormat.JPEG.toString());
// Use fragment for startActivityForResult() to initiate.
fragment.startActivityForResult(Intent.createChooser(intent, "Select Image"),GALLERY_OPEN_IMAGE_REQUEST_CODE);
}
}
IntentHelper 启动为:
IntentHelper intentHelper = new IntentHelper(this);
intentHelper.getGalleryImage();
修改后一切正常!!!
我想你可以在 activity 的 onActivityResult 中试试这个,调用 super.onActivityResult()
在片段中
在你的片段中确保你调用
startActivityForResult(intent,111); instead of getActivity().startActivityForResult(intent,111); inside your fragment.
你必须打电话
super.onActivityResult(requestCode, resultCode, data);
在 onActivityResult()
的 activity 中容纳片段之前片段本身可以接收 onActivityResult()
触发。只需将以下内容放入 Activity:
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
}
My all code is in fragment. But I don't think so it cause this problem
就是这个问题。
如果您调用 Activity#startActivityForResult()
,您会在 activity 中收到 onActivityResult
。
如果您调用 Fragment#startActivityForResult()
,您会在该片段中收到 onActivityResult
。
(这是如何在引擎盖下完成的,FragmentActivity
将片段索引编码为那些结果应该转到片段的调用的请求代码。)
因此,在 activity 中调用 startActivityForResult()
并期望在片段中看到结果是行不通的。要么将请求移动到片段,要么将响应处理移动到 activity.
此外,如果您不处理结果,请将其传递给 super
实施。
我的 IntentHelper class 是
public class IntentHelper {
private Activity activity;
// Camera activity request code
public static final int CAMERA_CAPTURE_IMAGE_REQUEST_CODE = 100;
//Gallery activity request code
public static final int GALLERY_OPEN_IMAGE_REQUEST_CODE = 101;
public IntentHelper(Activity activity){
this.activity = activity;
}
/**
* Launching gallery to get image
*/
public void getGalleryImage(){
Intent intent = new Intent();
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
intent.putExtra("aspectX", 1);
intent.putExtra("aspectY", 1);
intent.putExtra("scale", true);
intent.putExtra("outputFormat",
Bitmap.CompressFormat.JPEG.toString());
activity.startActivityForResult(Intent.createChooser(intent, "Select Image"),GALLERY_OPEN_IMAGE_REQUEST_CODE);
}
}
我将片段中的 class 称为:
IntentHelper intentHelper = new IntentHelper(getActivity());
intentHelper.getGalleryImage();
按照这个逻辑,我的图库意图已经成功打开。 但是:
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
// following if condition is not executing
if(requestCode == IntentHelper.GALLERY_OPEN_IMAGE_REQUEST_CODE)
{
if(resultCode == RESULT_OK){
SnackbarHelper.showSnackBar("Image browsed sucessfully",getView());
Toast.makeText(getContext(), "Image browsed successfully", Toast.LENGTH_SHORT).show();
}
else if(requestCode == RESULT_CANCELED){
SnackbarHelper.showSnackBar("Image browsed cancelled",getView());
}
}
}
我不知道为什么会这样。 我的意图被完美地调用并且让我返回相同的 activity 那为什么这个 onActivityResult() 条件不起作用???
My all code is in fragment. But I don't think so it cause this problem
编辑 - 解决方案
因为@laalto 给出的答案是正确的。我必须使用片段实例启动 startActivityForResult() 。
因此我将 IntentHelper class 更改为:
public class IntentHelper {
/*
* Instead of Activity use Fragment
*/
private Fragment fragment;
// Camera activity request code
public static final int CAMERA_CAPTURE_IMAGE_REQUEST_CODE = 100;
//Gallery activity request code
public static final int GALLERY_OPEN_IMAGE_REQUEST_CODE = 101;
public IntentHelper(Fragment fragment){
this.fragment = fragment;
}
/**
* Launching gallery to get image
*/
public void getGalleryImage() {
Intent intent = new Intent();
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
intent.putExtra("aspectX", 1);
intent.putExtra("aspectY", 1);
intent.putExtra("scale", true);
intent.putExtra("outputFormat",
Bitmap.CompressFormat.JPEG.toString());
// Use fragment for startActivityForResult() to initiate.
fragment.startActivityForResult(Intent.createChooser(intent, "Select Image"),GALLERY_OPEN_IMAGE_REQUEST_CODE);
}
}
IntentHelper 启动为:
IntentHelper intentHelper = new IntentHelper(this);
intentHelper.getGalleryImage();
修改后一切正常!!!
我想你可以在 activity 的 onActivityResult 中试试这个,调用 super.onActivityResult()
在片段中 在你的片段中确保你调用
startActivityForResult(intent,111); instead of getActivity().startActivityForResult(intent,111); inside your fragment.
你必须打电话
super.onActivityResult(requestCode, resultCode, data);
在 onActivityResult()
的 activity 中容纳片段之前片段本身可以接收 onActivityResult()
触发。只需将以下内容放入 Activity:
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
}
My all code is in fragment. But I don't think so it cause this problem
就是这个问题。
如果您调用 Activity#startActivityForResult()
,您会在 activity 中收到 onActivityResult
。
如果您调用 Fragment#startActivityForResult()
,您会在该片段中收到 onActivityResult
。
(这是如何在引擎盖下完成的,FragmentActivity
将片段索引编码为那些结果应该转到片段的调用的请求代码。)
因此,在 activity 中调用 startActivityForResult()
并期望在片段中看到结果是行不通的。要么将请求移动到片段,要么将响应处理移动到 activity.
此外,如果您不处理结果,请将其传递给 super
实施。