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方法中。然后,当您引用这些片段时,您可以直接访问它们,这绝对是有意义的。我试图做的是在我的
视图页面中更改页面时,在片段中设置一个按钮的动画。按钮在我的片段中,但由活动管理的页面。根据您的建议,我需要两个接口:一个是从片段到活动的接口,另一个是相反方向的接口。对吗?但这似乎是多余的……这绝对有道理。我试图做的是在我的视图页面中更改页面时,在片段中设置一个按钮的动画。按钮在我的片段中,但由活动管理的页面。根据您的建议,我需要两个接口:一个是从片段到活动的接口,另一个是相反方向的接口。对吗?但这似乎是多余的。。。