使用FragmentPagerAdapter时如何获取现有片段

问题描述 投票:99回答:13

我无法使片段通过使用ActivityFragmentPagerAdapter彼此通信,作为实现选项卡管理以及将ViewPager与关联的TabHost连接的所有详细信息的帮助程序类。我已经实现了FragmentPagerAdapter,与Android示例项目Support4Demos提供的一样。

主要问题是,当我既没有ID也没有Tag时,如何从FragmentManager中获得特定片段? FragmentPagerAdapter正在创建片段并自动生成ID和代码。

[使我的片段通过使用FragmentPagerAdapter的Activity作为实现了选项卡和所有详细信息的管理的帮助器类,使我的片段彼此通信...

android android-fragments fragmentpageradapter
13个回答
192
投票

问题摘要


0
投票
我不知道这是否是最好的方法,但是没有其他方法对我有用。所有其他选项,包括getActiveFragment,都返回null或导致应用程序崩溃。

[我注意到在屏幕旋转时,片段被附着了,所以我用它将片段发送回活动。


0
投票
[不确定我的方法是正确的还是最好的方法,因为我是Java / Android的相对入门者,但是它确实有效(我确定它违反了面向对象的原理,但是没有其他解决方案适用于我的用例)。

我有一个托管活动,该活动正在将ViewPager与FragmentStatePagerAdapter一起使用。为了获得对由FragmentStatePagerAdapter创建的片段的引用,我在片段类内创建了一个回调接口:


0
投票
此类无需依赖内部标签即可完成技巧。警告:应该使用getFragment方法而不是getItem方法来访问片段。

if (savedInstanceState != null) { if (mListFragment != null) mListFragment.setListItems(items); }


-5
投票
只需继续尝试此代码,

public interface Callbacks { public void addFragment (Fragment fragment); public void removeFragment (Fragment fragment); }


-5
投票

只是去尝试这个代码,

public class MYFragmentPAdp extends FragmentPagerAdapter {

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

    @Override
    public int getCount() {
        return 2;
    }

     @Override
     public Fragment getItem(int position) {
         if (position == 0)
             Fragment fragment = new Fragment1();
         else (position == 1)
             Fragment fragment = new Fragment2();
         return fragment;
     }
}

82
投票

我根据以下帖子找到了关于我的问题的答案:Fragments


15
投票

您不需要重写findFragmentByTag(),也不必依靠使用内部private String getFragmentTag(int viewPagerId, int fragmentPosition) { return "android:switcher:" + viewPagerId + ":" + fragmentPosition; } 方法创建片段标签的兼容性。 FragmentPagerAdapter是一个public

方法,因此您可以(实际上您应该

11
投票
我这样做的方式如下定义了WeakReferences的哈希表:

startUpdate


10
投票
我创建了此方法,该方法正在帮助我获取当前片段的引用。

protected Hashtable<Integer, WeakReference<Fragment>> fragmentReferences;


2
投票
@ personne3000建议的解决方案很好,但是有一个问题:当活动进入后台并被系统杀死(为了获得一些可用内存)然后恢复时,@Override public Fragment getItem(int position) { Fragment fragment; switch(position) { case 0: fragment = new MyFirstFragmentClass(); break; default: fragment = new MyOtherFragmentClass(); break; } fragmentReferences.put(position, new WeakReference<Fragment>(fragment)); return fragment; } 将为空,因为不会调用public Fragment getFragment(int fragmentId) { WeakReference<Fragment> ref = fragmentReferences.get(fragmentId); return ref == null ? null : ref.get(); }

下面的类处理这种情况:


1
投票
具有处理片段的主要障碍是您不能依赖getItem()。更改方向后,对片段的引用将为null,并且不会再次调用getItem()。

这是一种不依赖FragmentPagerAdapter的实现来获取标签的方法。覆盖InstantiateItem(),它将返回从getItem()创建或从片段管理器找到的片段。


0
投票
有关从FragmentPagerAdapter返回片段的信息,请参见fragmentReferences。确实依赖于您知道片段的索引-但这将在getItem()中设置(仅在实例化时)

0
投票
我设法通过使用ID而不是标签来解决此问题。 (我使用了我定义的FragmentStatePagerAdapter,它使用了我的自定义Fragments,其中我覆盖了onAttach方法,将id保存在某个地方:

getItem

© www.soinside.com 2019 - 2024. All rights reserved.