FragmentPagerAdapter与ViewPager和两个片段.转到第二个中的第一个并更新第一个文本

dav*_*ino 8 android updating android-fragments android-viewpager fragmentpageradapter

我不熟悉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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这就是我创建相关成员的方式:

ViewPager mViewPager = (ViewPager) findViewById(R.id.pager);
MyFragmentPagerAdapter mFragmentPagerAdapter = new MyFragmentPagerAdapter(getSupportFragmentManager());
mViewPager.setAdapter(mFragmentPagerAdapter);
Run Code Online (Sandbox Code Playgroud)

这就是我在我的活动中尝试过的其他内容,当我收到书名为Fragment并选择了标题的回调时:

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()?!?
Run Code Online (Sandbox Code Playgroud)

一系列问题:

调用适配器getView()将无法工作,因为它将返回一个新实例ExcerptsFragment,而不是当前连接的实例(正如预期的那样,抛出异常).

我在这里看到很多人(例子)只是在片段中存储片段getView().是对的吗?因为通过查看官方示例,对我来说似乎是反模式(通过持有项目来打败自动引用).这也是这里这里的意见(看起来对我来说).

有什么建议?如果我不理解这一切,我不会感到惊讶......

dav*_*ino 7

免责声明:虽然这对我来说完全没问题,但你应该意识到依赖于内部私人行为的经典陷阱.虽然我写的测试最终会警告我,如果内部实施改变了,我已经转移到更环保的牧场.你也应该这样做.因此,在我看来,这个问题及其答案的价值只是历史性的.


对这个问题感到抱歉,我认为这是一个小时.

为了解决这个问题,我按原样实现了这个解决方案.似乎工作得很好.所以,我认为这只是通过弄清楚其ID是如何命名来找到(当前附加的)片段实例的问题.上面的链接解释了它是如何制作的.

我选择回答我自己的问题而不是删除它,因为我相信这些寻呼机上的新手会受益于"真实情况".我见过的大多数答案都谈到了理论,这是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;
}
Run Code Online (Sandbox Code Playgroud)

所以,我感觉这是一个强大的解决方案,因为我没有对片段进行任何引用(因此冒着引用过时的风险).我至少保留了自己的代码,因此最大限度地减少了我做一些愚蠢事情的机会.

当然,如果你有什么要补充的,向我们展示,告诉我们这样做有什么不对或可以改进什么,我很乐意收到你的来信.


归档时间:

查看次数:

9821 次

最近记录:

8 年,10 月 前