Spi*_*idy 834 android android-fragments android-activity
托管此片段的活动onActivityResult在相机活动返回时调用.
我的片段开始一个结果的活动,其意图是发送给相机拍照.图片应用程序加载正常,拍照并返回.该onActivityResult然而,永远不会打.我设置了断点,但没有触发任何东西.一个片段可以onActivityResult吗?我想是因为它是一个提供的功能.为什么不被触发?
ImageView myImage = (ImageView)inflatedView.findViewById(R.id.image);
myImage.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(cameraIntent, 1888);
}
});
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if( requestCode == 1888 ) {
Bitmap photo = (Bitmap) data.getExtras().get("data");
((ImageView)inflatedView.findViewById(R.id.image)).setImageBitmap(photo);
}
}
Run Code Online (Sandbox Code Playgroud)
Spi*_*idy 1193
托管活动会覆盖onActivityResult(),但它没有调用super.onActivityResult()未处理的结果代码.显然,即使片段是进行startActivityForResult()调用的片段,活动也会在处理结果时获得第一个镜头.当您考虑片段的模块化时,这是有意义的.一旦我实现super.onActivityResult()了所有未处理的结果,该片段就可以处理结果.
而且来自@siqing的回答:
要在片段中获得结果,请确保调用startActivityForResult(intent,111);而不是getActivity().startActivityForResult(intent,111);在片段内.
小智 319
我想你打过电话getActivity().startActivityForResult(intent,111);.你应该打电话startActivityForResult(intent,111);.
Vin*_*yak 250
Option 1:
If you're calling startActivityForResult() from the fragment then you should call startActivityForResult(), not getActivity().startActivityForResult(), as it will result in fragment onActivityResult().
If you're not sure where you're calling on startActivityForResult() and how you will be calling methods.
Option 2:
Since Activity gets the result of onActivityResult(), you will need to override the activity's onActivityResult() and call super.onActivityResult() to propagate to the respective fragment for unhandled results codes or for all.
If above two options do not work, then refer to option 3 as it will definitely work.
Option 3:
An explicit call from fragment to the onActivityResult function is as follows.
In the parent Activity class, override the onActivityResult() method and even override the same in the Fragment class and call as the following code.
In the parent class:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
Fragment fragment = getSupportFragmentManager().findFragmentById(R.id.dualPane);
fragment.onActivityResult(requestCode, resultCode, data);
}
Run Code Online (Sandbox Code Playgroud)
In the child class:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// In fragment class callback
}
Run Code Online (Sandbox Code Playgroud)
Min*_*Man 82
我遇到了同样的问题ChildFragmentManager.管理器不会将结果传递给嵌套片段,您必须在基本片段中手动执行此操作.
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);
}
}
Run Code Online (Sandbox Code Playgroud)
ruX*_*ruX 82
如果您不知道活动中的片段,只需枚举它们并发送活动结果参数:
// In your activity
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
for (Fragment fragment : getSupportFragmentManager().getFragments()) {
fragment.onActivityResult(requestCode, resultCode, data);
}
}
Run Code Online (Sandbox Code Playgroud)
Ole*_* K. 59
FragmentActivityrequestCode由修改后的替换.之后,onActivityResult()将调用when ,FragmentActivity解析高16位并恢复原始Fragment的索引.看看这个方案:

如果在根级别有一些片段,则没有问题.但是如果你有嵌套的片段,例如Fragment里面有几个标签ViewPager,你保证会面临一个问题(或已经面临问题).
因为里面只存储了一个索引requestCode.这是Fragment其内部的索引FragmentManager.当我们使用嵌套片段时,有子FragmentManagers,它们有自己的片段列表.因此,有必要从root开始保存整个索引链FragmentManager.

我们如何解决这个问题?这篇文章中有一个常见的解决方法.
GitHub:https://github.com/shamanland/nested-fragment-issue
Kis*_*oid 43
这是最受欢迎的问题之一.我们可以找到很多有关此问题的主题.但它们都不适合我.
所以我使用这个解决方案解决了这个问题.
让我们先了解为什么会这样.
我们可以startActivityForResult直接从Fragment 调用,但实际上后面的机制都是由Activity处理的.
startActivityForResult从Fragment 调用后,requestCode将被更改为将Fragment的标识附加到代码中.这将使Activity能够跟踪收到结果后发送此请求的人员.
一旦Activity被导航回来,结果将被发送到Activity的onActivityResult,其中修改后的requestCode将被解码为原始requestCode + Fragment的标识.之后,Activity将通过onActivityResult将活动结果发送到该片段.这一切都完成了.
问题是:
Activity可以将结果仅发送到已直接附加到Activity而不是嵌套的Fragment.这就是为什么嵌套片段的onActivityResult永远不会被调用的原因.
解:
1)通过以下代码在片段中启动Intent:
/** Pass your fragment reference **/
frag.startActivityForResult(intent, REQUEST_CODE); // REQUEST_CODE = 12345
Run Code Online (Sandbox Code Playgroud)
2)现在在您的父活动覆盖**onActivityResult():**
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
}
Run Code Online (Sandbox Code Playgroud)
您必须在父活动中调用此方法才能使其正常工作.
3)在你的片段调用中:
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == Activity.RESULT_OK) {
}
}
Run Code Online (Sandbox Code Playgroud)
而已.使用此解决方案,它可以应用于任何单个片段,无论它是否嵌套.是的,它也涵盖了所有情况!此外,代码也很好,干净.
Luc*_*eto 18
对于许多嵌套的片段(例如,在片段中使用ViewPager时)
在您的主要活动中:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
}
Run Code Online (Sandbox Code Playgroud)
在你的片段中:
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
for (Fragment fragment : getChildFragmentManager().getFragments()) {
fragment.onActivityResult(requestCode, resultCode, data);
}
}
Run Code Online (Sandbox Code Playgroud)
在您的嵌套片段中
通话活动
getParentFragment().startActivityForResult(intent, uniqueInstanceInt);
Run Code Online (Sandbox Code Playgroud)
uniqueInstanceInt - 将其替换为嵌套片段中唯一的int,以防止另一个片段处理答案.
收到回复
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == uniqueInstanceInt ) {
// TODO your code
}
}
Run Code Online (Sandbox Code Playgroud)
注意
需要在uniqueInstanceInt中使用0到65536之间的数字以避免错误"对于requestCode只能使用低16位".
Moh*_*hta 18
对于那些谁使用Android的导航组件应在活动的使用onActivityResult(...)中primaryNavigationFragment得到它的片段参考和呼叫片段的fragment.onActivityResult(...)。
这是活动的 onActivityResult(...)
@Override
public void onActivityResult(int requestCode, int resultCode, Intent imageData)
{
super.onActivityResult(requestCode, resultCode, imageData);
for (Fragment fragment : getSupportFragmentManager().getPrimaryNavigationFragment().getChildFragmentManager().getFragments())
{
fragment.onActivityResult(requestCode, resultCode, imageData);
}
}
Run Code Online (Sandbox Code Playgroud)
小智 14
如果有人仍然无法做到,我可以添加两个建议.在Manifest.xml文件中,确保在回调时托管活动未完成,并且要启动的活动将启动模式作为标准.详情如下:
对于Hosting活动,如果有,则将no history属性设置为false
android:noHistory="false"
Run Code Online (Sandbox Code Playgroud)
对于要启动的活动,如果有,则将启动模式设置为标准
android:launchMode="standard"
Run Code Online (Sandbox Code Playgroud)
Sha*_*jib 12
我也面临同样的问题,一旦予移位的外代码块片段的工具类,具有parentActivity与传递参数,
Intent intent = new Intent(parentActivity, CameraCaptureActivity.class);
parentActivity.startActivityForResult(intent,requestCode);
Run Code Online (Sandbox Code Playgroud)
然后我没有得到onActivityResult该片段方法的任何值,之后,我将参数更改为Fragment,因此修改后的方法定义看起来像,
Intent intent = new Intent(fragment.getContext(), CameraCaptureActivity.class);
fragment.startActivityForResult(intent,requestCode);
Run Code Online (Sandbox Code Playgroud)
在那之后,我能够onActivityResult在片段中获得价值
Osc*_*nez 12
Kotlin 版本适用于使用 Android 导航组件的人,灵感来自 Mohit Mehta 的回答
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
supportFragmentManager.primaryNavigationFragment?.childFragmentManager?.fragments?.forEach { fragment ->
fragment.onActivityResult(requestCode, resultCode, data)
}
}
Run Code Online (Sandbox Code Playgroud)
小智 10
我也在片段中遇到了这个问题.我打电话startActivityForResult给DialogFragment.
但是现在这个问题已经解决了:
FragmentClassname.this.startActivityForResult.
在我的情况下,这是一个Android bug(http://technet.weblineindia.com/mobile/onactivityresult-not-getting-called-in-nested-fragments-android/),如果你使用支持,FragmentActivity你必须使用getSupportFragmentManager而不是getChildFragmentManager:
List<Fragment> fragments = getSupportFragmentManager().getFragments();
if (fragments != null) {
for (Fragment fragment : fragments) {
if(fragment instanceof UserProfileFragment) {
fragment.onActivityResult(requestCode, resultCode, data);
}
}
}
Run Code Online (Sandbox Code Playgroud)
小智 6
解决方案1:
打电话startActivityForResult(intent, REQUEST_CODE);而不是getActivity().startActivityForResult(intent, REQUEST_CODE);.
解决方案2:
当startActivityForResult(intent, REQUEST_CODE);被称为活动的onActivityResult(requestCode,resultcode,intent)调用,然后你可以调用fragments onActivityResult()从这里开始,穿过requestCode, resultCode and intent.
在您的主要活动中:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
}
Run Code Online (Sandbox Code Playgroud)
在您的主顶级片段(ViewPager片段)中:
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
YourFragment frag = (YourFragment) getChildFragmentManager().getFragments().get(viewPager.getCurrentItem());
frag.yourMethod(data); // Method for callback in YourFragment
super.onActivityResult(requestCode, resultCode, data);
}
Run Code Online (Sandbox Code Playgroud)
在YourFragment中(嵌套片段):
public void yourMethod(Intent data){
// Do whatever you want with your data
}
Run Code Online (Sandbox Code Playgroud)
小智 5
简而言之,
在片段中,声明Fragment fragment = this;
在那之后使用fragment.startActivityForResult.
结果将在activityResult中返回.
在片段内,请致电
this.startActivityForResult(intent, REQUEST_CODE);
Run Code Online (Sandbox Code Playgroud)
哪里this指的是片段.否则就像@Clevester所说:
Fragment fragment = this;
....
fragment.startActivityForResult(intent, REQUEST_CODE);
Run Code Online (Sandbox Code Playgroud)
我也不得不打电话
super.onActivityResult(requestCode, resultCode, data);
Run Code Online (Sandbox Code Playgroud)
在父活动onActivityResult中使其工作.
(我根据@Clevester的回答改编了这个答案.)
对于Android 的 Navigation 组件,当您嵌套 Fragments 时,这个问题可能会让人觉得是一个无法解开的谜。
根据这篇文章中以下答案的知识和灵感,我设法制定了一个简单的解决方案:
在您的活动的 中onActivityResult(),您可以遍历使用FragmentManager的getFragments()方法获得的活动片段列表。
请注意,要执行此操作,您需要使用getSupportFragmentManager()或 目标 API 26 及更高版本。
这里的想法是遍历列表,检查列表中每个 Fragment 的实例类型,使用instanceof.
虽然循环遍历此类型列表Fragment是理想的,但不幸的是,当您使用 Android 导航组件时,该列表将只有一项,即NavHostFragment.
那么现在怎么办?我们需要让NavHostFragment. NavHostFragment本身就是一个 Fragment。所以使用getChildFragmentManager().getFragments(),我们再次获得了一个List<Fragment>我们已知的 Fragment NavHostFragment。我们遍历该列表检查instanceof每个 Fragment。
一旦我们在列表中找到我们感兴趣的 Fragment,我们就调用它的onActivityResult(),将 ActivityonActivityResult()声明的所有参数传递给它。
// Your activity's onActivityResult()
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
List<Fragment> lsActiveFragments = getSupportFragmentManager().getFragments();
for (Fragment fragmentActive : lsActiveFragments) {
if (fragmentActive instanceof NavHostFragment) {
List<Fragment> lsActiveSubFragments = fragmentActive.getChildFragmentManager().getFragments();
for (Fragment fragmentActiveSub : lsActiveSubFragments) {
if (fragmentActiveSub instanceof FragWeAreInterestedIn) {
fragmentActiveSub.onActivityResult(requestCode, resultCode, data);
}
}
}
}
}Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
370703 次 |
| 最近记录: |