【问题标题】:How to make onActivityResult get called on nested fragment from viewpager如何使 onActivityResult 被 viewpager 的嵌套片段调用
【发布时间】:2017-10-20 14:05:52
【问题描述】:

这是一个著名的问题,即从活动中获取结果到嵌套片段,活动只能将结果发送到已直接附加到活动的片段而不是嵌套片段。这就是为什么嵌套片段的 onActivityResult 无论如何都不会被调用的原因。 在我的情况下,我有一个包含一个片段的活动,该片段有一个带有一堆片段的 viewPager。 在 viewPager 的其中一个片段中,我尝试启动相机意图,此意图返回的结果永远不会发送到最后一个片段,我尝试了几个我找到的答案,但没有一个是稳健的,其中一个解决方案是创建一个 EventBus 对象以将 resultCode 从活动扩散到所有片段,但它不适用于这种情况,有什么帮助吗??

【问题讨论】:

    标签: android android-viewpager onactivityresult android-nested-fragment


    【解决方案1】:

    我可能有一个可行的解决方案,因为我曾经处于非常相似的情况。

    简而言之,我不再依赖FragmentonActivityResult(),而是自己实现了一个工作逻辑。

    您应该信任的唯一onActivityResult() 是您的Activity

    你可以像这个一样创建interface

    public interface ActivityResultDispatcher {
        // Pass anything you want, Bundle, Intent, ecc...
        // For the sake of simplicity I'm using Bundle...
        public void dispatchResultData(final Bundle data);
    }
    

    并让您的 Fragment 类实现它。

    你的Activity 和你的primary Fragment之间的沟通应该很容易,你可以做这样的事情(在你的Activity):

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        final Bundle bundle = new Bundle();
        // put data inside Bundle
        this.primaryFrament.dispatchResultData(bundle);
    }
    

    现在,您的主要Fragment 是拥有ViewPager 和其他Frament 类的那个。

    所以在你的主Fragment 你会这样做:

    @Override public void dispatchResultData(final Bundle data) {
    
        for (int i = 0; i < MyViewPager.NUM_FRAGMENTS; i++) {
            final ActivityResultDispatcher subFragment = (ActivityResultDispatcher) this.retrieveFragment(i);
    
            // some fragments in ViewPager may be dynamically deleted
            if (subFragment != null) {
                subFragment.dispatchResultData(data);
            } 
        }
    }
    

    retrieveFragment(final int position) 函数是我在网上找到的一段非常舒适的代码。

    ViewPager 的实现如下:

    public Fragment retrieveFragment(final int position) {
        return this.fragmentManager.findFragmentByTag("android:switcher:" + R.id.my_pager_id + ":" + position);
    }
    

    您在ViewPager 中的所有活动Fragment 课程都将收到Bundle,您可以决定如何处理它。

    您可以将更多信息传递给调度员,例如

    public void dispatchResultData(final Bundle data, final int requestCode); 
    

    并让您的 Fragment 决定它是否应该响应函数调用。

    您基本上已经构建了一个完整的功能齐全的onActivityResult() 实用程序,并且可以确保您的所有Fragments(如果已实例化)都会收到结果。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-14
      • 2016-05-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多