【问题标题】:onActivityResult not called from fragment未从片段调用 onActivityResult
【发布时间】: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 既没有在父活动中调用,也没有在片段中调用。

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

【问题讨论】:

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

标签: java android android-fragments navigation android-fragmentactivity


【解决方案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?

【讨论】:

    猜你喜欢
    • 2011-09-03
    • 2017-08-25
    相关资源
    最近更新 更多