从其父活动刷新一个片段

4
我有一个与此问题几乎完全相同的问题:Android, How to restart/refresh a fragment from FragmentActivty? 我试图从父FragmentActivity调用ListFragment的方法。
然而,我正在使用由eclipse生成的Swipe + Fixed Tabs模板。我尝试调用getSupportFragmentManager().findFragmentById(R.id.myfragment),但返回值始终为null。我猜这可能是一个问题,因为我没有在我的应用程序中定义myfragment。但是我不确定在哪里定义它,因为所有片段都是动态创建的。
对于那些不熟悉由Android SDK在Eclipse中生成的Swipe + Fixed Tabs模板的人来说,片段是通过重写FragmentPagerAdapter getItem函数创建的,返回我的片段的新实例。
任何帮助将不胜感激。
相关代码: 我如何设置我的适配器:
mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager());

// Set up the ViewPager with the sections adapter.
mViewPager = (ViewPager) findViewById(R.id.activity_comment);
mViewPager.setAdapter(mSectionsPagerAdapter);

覆盖Adapter的getItem函数:

@Override
    public Fragment getItem(int position) {
        // getItem is called to instantiate the fragment for the given page.
        // Return a DummySectionFragment (defined as a static inner class
        // below) with the page number as its lone argument.

        switch(position) {
        case 0:
            return CommentsFragment.newInstance();

        case 1:
        default:
            return LikesFragment.newInstance();
        }
    }

newInstance()函数仅返回它们自己的实例,因为我的Fragment类是静态的。


你应该发布相关的代码片段。如果我没有误解你的问题,你可以尝试为片段分配一个标签,并尝试使用findFragemtByTag检索它。 - Blackbelt
更新了带有相关代码的问题。 - l3utterfly
4个回答

9

你需要这样做:

frag.getFragmentManager().beginTransaction().detach(frag).commit();
frag.getFragmentManager().beginTransaction().attach(frag).commit();

3
可以再详细说明一下吗?我应该把这放在哪里?frag变量是我的片段之一吗? - l3utterfly

8
你可以通过标签找到你的片段,但是在添加片段时,你需要为它指定一个标签。
首先,使用标签添加你的片段:
        fragmentManager = getFragmentManager();
        fragmentTransaction = fragmentManager.beginTransaction();
        SomeFragment fragment = new ManageLinksFragment();
        fragmentTransaction.add(R.id.fragment_container1,fragment, "sometag");
        fragmentTransaction.commit();

接下来,在Activity的站点:

SomeFragment mSomeFragment = (SomeFragment) getFragmentManager().findFragmentByTag("sometag");
// now mSomeFragment.callsomething();

1
我不确定如何实现你的方法。我已经更新了问题,并附上了我的代码。显然,我没有使用fragmentTransaction将片段添加到管理器中。 - l3utterfly
1
无法工作。出现错误:“无法更改片段的标记”。请参阅我的相关问题:http://stackoverflow.com/questions/24833912/refresh-fragment-ui-from-fragmentactivity - Dr.jacky
如果您的应用程序支持v4,请使用getSupportFragmentManager()。 - Prakash
这是唯一的方法吗?为什么不将片段实例保存在活动类的属性中呢? - JCarlosR

3

你的片段由适配器管理。因此,你还需要调用适配器来刷新你的片段。这些步骤是必要的:

  1. Override getItemPosition in your Adapter

    @Override
    public int getItemPosition(Object object) {
        // POSITION_NONE makes it possible to reload the PagerAdapter
        return POSITION_NONE;
    }
    
  2. Once you did that call

    mViewPager.getAdapter.notifyDataSetChanged();
    

    in your Activity. From the fragment object itself you could use a callback to inform the Activity of the need to refresh.

这将使用新的片段实例刷新viewPager,就像重新启动/刷新片段一样。希望这有所帮助,这就是你要找的内容。

1

getFragmentManager().beginTransaction().detach(this).attach(this).commit();


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接