未从片段调用 onActivityResult

Posted

技术标签:

【中文标题】未从片段调用 onActivityResult【英文标题】:onActivityResult not called from fragment 【发布时间】:2019-12-05 08:47:44 【问题描述】:

我有一个包含BottomNavigationViewNavHostFragment 的活动。

@Override
protected void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main_activity);
    BottomNavigationView bottomNavigationView = findViewById(R.id.bottom_navigation);

    bottomNavigationView.setSelectedItemId(R.id.navigation_profile);

    NavController navController = Navigation.findNavController(this, R.id.myNavHostFragment);
    NavigationUI.setupWithNavController(bottomNavigationView, navController); 

我还在这个父活动中添加了onActivityResult 方法。

@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) 
    super.onActivityResult(requestCode, resultCode, data);
    Toast.makeText(this,"Parent onActivity",Toast.LENGTH_SHORT).show();
    for (Fragment fragment : getSupportFragmentManager().getFragments()) 
        fragment.onActivityResult(requestCode, resultCode, data);
    

在片段中,我有一个ImageView,我在其中使用 Intent 从用户那里挑选图像。

Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("image/jpeg");
intent.putExtra(Intent.EXTRA_LOCAL_ONLY, true);
this.startActivityForResult(Intent.createChooser(intent, "Complete action using"), RC_PHOTO_PICKER);

在片段的onActivityResult我正在这样做:

@Override
public void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) 
    Toast.makeText(getActivity(),"OnActivityResult",Toast.LENGTH_SHORT).show();

    // Result returned from launching the Intent to select image for profile
    if (requestCode == RC_PHOTO_PICKER && resultCode == Activity.RESULT_OK) 
        Toast.makeText(getActivity(),"Called",Toast.LENGTH_SHORT).show();
    

问题是onActivityResult 既没有在父活动中调用,也没有在片段中调用。

我尝试了Answer1、Answer2、Answer3 中提供的各种解决方案。 但它们都不起作用!

【问题讨论】:

RC_PHOTO_PICKER 的值是多少? this 中的 this.startActivityForResult 是你的 Fragment 吗? RC_PHOTO_PICKER 的@ianhanniballake 值为 2,定义为常量,this 指的是片段 您能否在 androidManifest.xml 中为您的活动包含该条目? 里面什么都没有:<activity android:name=".FirstScreen" /> 您是否在清单中使用任何其他活动?特别是在清单条目中使用android:launchMode 的任何人? 【参考方案1】:

您不能将 Intent.createChooser()Intent.GET_CONTENT 一起使用 - 对于活动和片段都是如此。

相反,只需将您的 Intent 直接与 startActivityForResult 一起使用。

【讨论】:

我从 udacity 课程中得到了这个代码:Firebase in a Weekend:Link。让我试试你的建议。 仍然无法解决问题。甚至没有在父活动中调用:( 其他活动是否开始? onCreate 仅在包含 navHostFragment 的父活动中调用 不,我的意思是在您调用startActivityForResult 后,屏幕上会出现GET_CONTENT 活动吗?【参考方案2】:

将以下代码块添加到父 onActivityResult

for (Fragment fragment : getSupportFragmentManager().getFragments()) 
   //send result to all child fragment
       if(fragment!=this)
        fragment.onActivityResult(requestCode, resultCode, data);
    

【讨论】:

我在父活动中也使用了Toast,它没有被调用【参考方案3】:

不太确定,但是否可能是片段正在调用意图?您能否尝试在单击 imageView 或按钮时使用侦听器,然后拦截它并从父 Activity 调用 Intent?

【讨论】:

以上是关于未从片段调用 onActivityResult的主要内容,如果未能解决你的问题,请参考以下文章

Android ViewModel 未从 BackStackEntry 获取选定项

C# Web Api 调用未从 jquery 调用

未从 IntentService 调用 onLocationChanged

未从自定义 uitableviewcell 调用 prepareForSegue

iOS locationmanager didChangeAuthorizationStatus 未从 kCLAuthorizationStatusDenied 调用到 kCLAuthorizatio

未从 aspx 页面调用代码隐藏函数