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().是对的吗?因为通过查看官方示例,对我来说似乎是反模式(通过持有项目来打败自动引用).这也是这里和这里的意见(看起来对我来说).
有什么建议?如果我不理解这一切,我不会感到惊讶......
免责声明:虽然这对我来说完全没问题,但你应该意识到依赖于内部私人行为的经典陷阱.虽然我写的测试最终会警告我,如果内部实施改变了,我已经转移到更环保的牧场.你也应该这样做.因此,在我看来,这个问题及其答案的价值只是历史性的.
对这个问题感到抱歉,我认为这是一个小时.
为了解决这个问题,我按原样实现了这个解决方案.似乎工作得很好.所以,我认为这只是通过弄清楚其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 次 |
| 最近记录: |