onActivityResult from Activity to Fragment
onActivityResult from Activity to Fragment
我对 onActivityResult 有疑问。首先,我打开添加新消息片段到 select 图像。当我 select 图像时,它不会 return 我当前片段的结果。我将 onActivityResult 放在我的 MainActivity 和 AddMessageFragment 中,但它不会在我的片段中调用结果。我的 MainActivity 用于设置导航控制器。我使用 Matisse 库作为我的图像选择器。有人可以帮我吗?被这个问题困了一整天。
主要活动
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data)
{
super.onActivityResult(requestCode, resultCode, data);
}
AddMessageFragment
@OnClick({R.id.addImage})
public void openGallery()
{
permission.addOnStorageListener(new Permission.OnStorageSuccess()
{
@Override
public void OnStorageSuccess()
{
permission.requestCamera();
}
});
permission.addOnCameraListener(new Permission.OnCameraSuccess()
{
@Override
public void OnCameraSuccess()
{
Matisse.from(getActivity())
.choose(MimeType.of(MimeType.JPEG, MimeType.PNG))
.countable(false)
.capture(true)
.captureStrategy(new CaptureStrategy(true, "com.gprop.users.fileprovider"))
.maxSelectable(1)
.restrictOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT)
.thumbnailScale(0.85f)
.imageEngine(new Glide4Engine())
.originalEnable(false)
.forResult(99);
}
});
permission.requestStorage();
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data)
{
super.onActivityResult(requestCode, resultCode, data);
if(requestCode == 99 && resultCode == Main.RESULT_OK)
{
mSelected = Matisse.obtainPathResult(data);
if(mSelected.size() > 0)
{
Glide.with(this).load(mSelected.get(0)).into(addImage);
Luban.compress(new File(mSelected.get(0)), getActivity().getFilesDir())
.putGear(Luban.THIRD_GEAR)
.asObservable()
.subscribe(new Consumer<File>()
{
@Override
public void accept(File file) throws Exception
{
newfile = file;
}
}, new Consumer<Throwable>()
{
@Override
public void accept(Throwable throwable) throws Exception
{
throwable.printStackTrace();
Toast.makeText(getActivity(), throwable.getMessage(), Toast.LENGTH_SHORT).show();
}
});
}
else
{
Toast.makeText(getActivity(), "No image selected", Toast.LENGTH_SHORT).show();
}
}
}
片段对onActivityResult函数的显式调用如下。
在父Activityclass中,覆盖onActivityResult()方法,甚至在FragmentClass中覆盖相同的方法,调用如下代码.
在主要Activity class:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
Fragment fragment = getSupportFragmentManager().findFragmentById(R.id.layoutContainer);
fragment.onActivityResult(requestCode, resultCode, data);
}
在AddMessageFragment class:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// In fragment class callback
}
您正在从 getActivity()
方法获得的 Activity
上调用 Matisse.from()
,tit 必须返回您的 MainActivity
和 onActivityResult
将在 MainActivity
中被调用,您什么都不做并调用 super.onActivityResult()
.
可能的解决方案:。
- 将您的
onActivityResult
代码逻辑从 AddMessageFragment
转移到 MainActivity
- 把你
Matisse
的调用从Matisse.from(getActivity())
改成Matisse.from(this)
,因为看Matisse
的源码也支持Fragment context
使用第二种解决方案,您应该在片段中获得 onActivityResult
回调,您不需要 change/shift 任何其他代码逻辑。
希望这对您有所帮助:)
将您的 activity onActivityResult 方法替换为以下代码
public void onActivityResult(int requestCode, int resultCode, Intent intent) {
super.onActivityResult(requestCode, resultCode, intent);
Fragment fragment = (Fragment) getChildFragmentManager().findFragmentByTag(childTag);
if (fragment != null) {
fragment.onActivityResult(requestCode, resultCode, intent);
}
}
执行后它会调用你的片段onActivityResult。
我对 onActivityResult 有疑问。首先,我打开添加新消息片段到 select 图像。当我 select 图像时,它不会 return 我当前片段的结果。我将 onActivityResult 放在我的 MainActivity 和 AddMessageFragment 中,但它不会在我的片段中调用结果。我的 MainActivity 用于设置导航控制器。我使用 Matisse 库作为我的图像选择器。有人可以帮我吗?被这个问题困了一整天。
主要活动
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data)
{
super.onActivityResult(requestCode, resultCode, data);
}
AddMessageFragment
@OnClick({R.id.addImage})
public void openGallery()
{
permission.addOnStorageListener(new Permission.OnStorageSuccess()
{
@Override
public void OnStorageSuccess()
{
permission.requestCamera();
}
});
permission.addOnCameraListener(new Permission.OnCameraSuccess()
{
@Override
public void OnCameraSuccess()
{
Matisse.from(getActivity())
.choose(MimeType.of(MimeType.JPEG, MimeType.PNG))
.countable(false)
.capture(true)
.captureStrategy(new CaptureStrategy(true, "com.gprop.users.fileprovider"))
.maxSelectable(1)
.restrictOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT)
.thumbnailScale(0.85f)
.imageEngine(new Glide4Engine())
.originalEnable(false)
.forResult(99);
}
});
permission.requestStorage();
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data)
{
super.onActivityResult(requestCode, resultCode, data);
if(requestCode == 99 && resultCode == Main.RESULT_OK)
{
mSelected = Matisse.obtainPathResult(data);
if(mSelected.size() > 0)
{
Glide.with(this).load(mSelected.get(0)).into(addImage);
Luban.compress(new File(mSelected.get(0)), getActivity().getFilesDir())
.putGear(Luban.THIRD_GEAR)
.asObservable()
.subscribe(new Consumer<File>()
{
@Override
public void accept(File file) throws Exception
{
newfile = file;
}
}, new Consumer<Throwable>()
{
@Override
public void accept(Throwable throwable) throws Exception
{
throwable.printStackTrace();
Toast.makeText(getActivity(), throwable.getMessage(), Toast.LENGTH_SHORT).show();
}
});
}
else
{
Toast.makeText(getActivity(), "No image selected", Toast.LENGTH_SHORT).show();
}
}
}
片段对onActivityResult函数的显式调用如下。
在父Activityclass中,覆盖onActivityResult()方法,甚至在FragmentClass中覆盖相同的方法,调用如下代码.
在主要Activity class:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
Fragment fragment = getSupportFragmentManager().findFragmentById(R.id.layoutContainer);
fragment.onActivityResult(requestCode, resultCode, data);
}
在AddMessageFragment class:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// In fragment class callback
}
您正在从 getActivity()
方法获得的 Activity
上调用 Matisse.from()
,tit 必须返回您的 MainActivity
和 onActivityResult
将在 MainActivity
中被调用,您什么都不做并调用 super.onActivityResult()
.
可能的解决方案:。
- 将您的
onActivityResult
代码逻辑从AddMessageFragment
转移到MainActivity
- 把你
Matisse
的调用从Matisse.from(getActivity())
改成Matisse.from(this)
,因为看Matisse
的源码也支持Fragment context
使用第二种解决方案,您应该在片段中获得 onActivityResult
回调,您不需要 change/shift 任何其他代码逻辑。
希望这对您有所帮助:)
将您的 activity onActivityResult 方法替换为以下代码
public void onActivityResult(int requestCode, int resultCode, Intent intent) {
super.onActivityResult(requestCode, resultCode, intent);
Fragment fragment = (Fragment) getChildFragmentManager().findFragmentByTag(childTag);
if (fragment != null) {
fragment.onActivityResult(requestCode, resultCode, intent);
}
}
执行后它会调用你的片段onActivityResult。