-->

与ViewPager和两个片段FragmentPagerAdapter。 从第二转至第一和更新第

2019-07-28 19:32发布

我不熟悉FragmentPagerAdapter ,所以这将是那些我们(你)批判地阅读说明的问题之一。

结构:我有一个FragmentPagerAdapter (下面的代码),将同时举办两个片段。 第一个是显示书籍摘录,而第二本书的标题列表。

目标:我想达到的目标是在标题中描述:用户可以导航到寻呼机的第二个片段,点击标题,然后我想用户移回第一个片段,并告诉第一个片段更新文本。 所述第一片段具有triggerRefresh用于该方法。

代码:我相信我的问题是因为方式的FragmentPagerAdapter重用/创建片段(我不明白)。 这是我的课:

static class MyFragmentPagerAdapter extends FragmentPagerAdapter {

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

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

    @Override
    public Fragment getItem(int position) {
        switch(position) {
        case 0:
            return new ExcerptsFragment();
        case 1:
            return new BookListFragment();
        default:
            throw new IllegalArgumentException("not this many fragments: " + position);
        }
    }
}

这是我创建的相关成员:

ViewPager mViewPager = (ViewPager) findViewById(R.id.pager);
MyFragmentPagerAdapter mFragmentPagerAdapter = new MyFragmentPagerAdapter(getSupportFragmentManager());
mViewPager.setAdapter(mFragmentPagerAdapter);

这就是我在我的活动其他地方试行,当我收到从书名片段与所选标题的回调:

mViewPager.setCurrentItem(0); // back to excerpts screen page. It's OK.
// Here's the problem! How to identify the fragment 0 
// to ExcerptsFragment and call its triggerRefresh()?!?

问题系列:

调用适配器的getView()不会工作,因为它会返回一个新的实例ExcerptsFragment ,这是不是当前连接的一个(如预期,引发异常)。

我在这里看到很多人( 例如 )只是存储片段在getView() 是对的吗? 因为通过看官方的例子,似乎是一个反模式,我(击败握住物品的自动参考)。 而这还认为这里和这里 (右看起来对我来说)。

有什么建议? 如果我不理解这一切的一个位我也不会感到惊讶?

Answer 1:

免责声明: 虽然这个已经工作过完美的罚款对我来说, 你应该知道这取决于内部,私人行为的经典陷阱 虽然我写了测试,最终会警告我,如果内部实现改变,因为我已经转移到择木而栖 。 而你也应该这样。 因此,这个问题和答案的价值只是历史,在我看来。


很抱歉这个问题,我认为这是小时。

为了解决这个问题,我实现了这个解决方案为是。 似乎工作就好了。 所以,我相信这只是搞清楚它的编号是如何命名找到(当前连接)片段实例的问题。 上面的链接解释它是如何做。

我选择回答我的问题,而不是将其删除,因为我相信像我这样的新手对这些寻呼机会从一个“真正的情况”中受益。 大多数我见过的话很有有关理论,这是BTW正道的答案......但没有一个真实的例子来工作有时对我这样的人迷失方向。

总之,这里是我需要代码(以上注释的部分)的最后一块:

int n = 0;
mViewPager.setCurrentItem(n); // in the question I had stopped here.

ExcerptsFragment f = (ExcerptsFragment) ContainerActivity.this
        .getSupportFragmentManager().findFragmentByTag(getFragmentTag(n));
f.triggerRefresh();

// ... below the helper method: used the solution from the link.

private String getFragmentTag(int pos){
    return "android:switcher:"+R.id.pager+":"+pos;
}

所以,我有一种感觉,这是一个强大的解决方案,因为我不持有任何引用片段(因此正在冒着过时的参考资料)。 我一直在我自己的代码在最低限度,因此最大限度地减少了我的机会做一些愚蠢的事。

当然,如果你有什么要补充,向我们展示了,告诉什么是错在做或者什么可以改进,我会很高兴收到你的来信。



Answer 2:

我搜索了一个解决这个问题,而我自己。 你的原则方法有效,但它会破坏你的代码,如果曾经的片段标签创建的,在Android基类实现改变的代码。 这是一个很讨厌的依赖!

一个更优雅的方法是扭转的问题,并保持你的基地活动的一个实例,在你的片段。 实现对标签的二传手在您的活动,并调用在创建片段内 - 标签根本就可用getTag()。

示例实现,可以发现在这里 。



Answer 3:

我用在WeakReferences来在创建的片段解决了这个问题。 请参阅: https://stackoverflow.com/a/23843743/734151

如果你发现什么不对的这种做法,请评论。



文章来源: FragmentPagerAdapter with ViewPager and two Fragments. Go to the first from the second and update first's text