Android 何时访问ViewPager中的片段? 问题

Android 何时访问ViewPager中的片段? 问题,android,android-fragments,android-viewpager,Android,Android Fragments,Android Viewpager,不久前,我一直在寻找解决方案。这个解决方案对我来说很有意义。但是,我在何时尝试访问当前显示的片段方面遇到了问题。我使用了与链接问题相同的设置:一个ViewPager和一个FragmentStatePagerAdapter。我已经按照解决方案的建议对我的FragmentStatePagerAdapter进行了调整: private class MyPagerAdapter extends FragmentStatePagerAdapter { SparseArray<Frag

不久前,我一直在寻找解决方案。这个解决方案对我来说很有意义。但是,我在何时尝试访问当前显示的片段方面遇到了问题。我使用了与链接问题相同的设置:一个
ViewPager
和一个
FragmentStatePagerAdapter
。我已经按照解决方案的建议对我的
FragmentStatePagerAdapter
进行了调整:

private class MyPagerAdapter extends FragmentStatePagerAdapter {
        SparseArray<Fragment> registeredFragments = new SparseArray<>();

        public MyPagerAdapter(FragmentManager fm) {
            super(fm);
        }

        @Override
        public void setPrimaryItem(ViewGroup container, int position, Object object) {
            super.setPrimaryItem(container, position, object);
        }

        @Override
        public Fragment getItem(int position) {
            mCursor.moveToPosition(position);
            return ArticleDetailFragment.newInstance(mCursor.getLong(ArticleLoader.Query._ID));
        }

        @Override
        public int getCount() {
            return (mCursor != null) ? mCursor.getCount() : 0;
        }

        @Override
        public Object instantiateItem(ViewGroup container, int position) {
            Fragment fragment = (Fragment) super.instantiateItem(container, position);
            registeredFragments.put(position, fragment);

            return fragment;
        }

        @Override
        public void destroyItem(ViewGroup container, int position, Object object) {
            registeredFragments.remove(position);
            super.destroyItem(container, position, object);
        }

        public Fragment getRegisteredFragment(int position) {
            return registeredFragments.get(position);
        }
    }
…但我的片段总是空的。这是因为
onResume()
是在我的适配器中调用
instanceItem()
之前调用的。片段为空,因为尚未将任何片段添加到适配器内的
registeredFragments

问题: 我希望得到一些关于我应该使用哪个活动生命周期方法的指导,如果
instanceItems()
已经被调用了,那么我就可以使用实际的片段了。和往常一样,如果您能在这方面提供帮助,我们将不胜感激

附加背景
我真正想要实现的是获取对片段的引用,这样我就可以实例化我在活动中定义的回调接口。我希望使用此界面与当前显示在
ViewPager
中的片段进行通信。然而,为了能够做到这一点,我首先需要对当前片段的引用

实例化Items()
通常由
getItem()
调用以获取新的
视图
,理想情况下
片段
是在
getItem()
方法中创建的,因此您需要在
getItem()
中使用
put()
方法,如中所示

 @Override
 public Fragment getItem(int position) {
      mCursor.moveToPosition(position);
      Fragment createdFragment = ArticleDetailFragment.newInstance(mCursor.getLong(ArticleLoader.Query._ID));
      registeredFragments.put(position, createdFragment );
      return createdFragment;
 } // also remove InstantiateItems() method

虽然
InstantiateItems()
通常由
getItem()
调用以获取新的
视图
,理想情况下
片段
是在
getItem()
方法中创建的,因此您需要在
getItem()
中使用
put()
方法,如中所示

 @Override
 public Fragment getItem(int position) {
      mCursor.moveToPosition(position);
      Fragment createdFragment = ArticleDetailFragment.newInstance(mCursor.getLong(ArticleLoader.Query._ID));
      registeredFragments.put(position, createdFragment );
      return createdFragment;
 } // also remove InstantiateItems() method

它们的一般规则应该是

别打电话给我。我会打电话给你

这意味着您应该让
片段
通知其他人它何时可用以及它愿意共享哪些数据。您可以通过某种接口和/或回调方法来实现这一点。Android文档展示了如何在两个片段之间进行通信。同样的概念也适用,因为这种交流是通过父活动进行的。如果您想与活动通信,那么可以跳过将消息发送到另一个片段的步骤


基本思想是,应该给片段一个回调,而不是将片段用作回调

别打电话给我。我会打电话给你

这意味着您应该让
片段
通知其他人它何时可用以及它愿意共享哪些数据。您可以通过某种接口和/或回调方法来实现这一点。Android文档展示了如何在两个片段之间进行通信。同样的概念也适用,因为这种交流是通过父活动进行的。如果您想与活动通信,那么可以跳过将消息发送到另一个片段的步骤


基本思想是,您应该给片段一个回调,而不是将片段用作回调。

您不能简单地将实例化片段的列表传递给MyPagerAdapter构造函数并填充registeredFragments.put(位置,片段);在该数组的实例化Item方法中。然后,当您引用这些片段时,您可以直接访问它们。您不能简单地将实例化片段的列表传递给MyPagerAdapter构造函数并填充registeredFragments.put(position,fragment);在该数组的实例化Item方法中。然后,当您引用这些片段时,您可以直接访问它们,这绝对是有意义的。我试图做的是在我的
视图页面中更改页面时,在片段中设置一个按钮的动画。按钮在我的片段中,但由活动管理的页面。根据您的建议,我需要两个接口:一个是从片段到活动的接口,另一个是相反方向的接口。对吗?但这似乎是多余的……这绝对有道理。我试图做的是在我的
视图页面中更改页面时,在片段中设置一个按钮的动画。按钮在我的片段中,但由活动管理的页面。根据您的建议,我需要两个接口:一个是从片段到活动的接口,另一个是相反方向的接口。对吗?但这似乎是多余的。。。