【问题标题】:refresh a fragment from its parent activity从其父活动刷新片段
【发布时间】:2013-10-30 08:28:22
【问题描述】:

我在这里遇到了与这个问题几乎完全相同的问题:Android, How to restart/refresh a fragment from FragmentActivty?

我正在尝试从父 FragmentActivity 调用 ListFragment 的方法。

但是,我使用的是 Eclipse 生成的模板 Swipe + Fixed Tabs。我尝试调用getSupportFragmentManager().findFragmentById(R.id.myfragment),但返回值始终为空。我猜这可能是个问题,因为我没有在我的应用程序的任何地方定义myfragment。但我不确定在哪里定义它,因为所有片段都是动态创建的。

对于不熟悉 Eclipse 中 Android SDK 生成的 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);

重写适配器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() 函数只是返回它们自己的一个实例,因为我的片段的类是静态的。

【问题讨论】:

  • 你应该发布相关的sn-p代码。同样,如果我没有误解您的问题,您可以尝试为片段分配标签并尝试使用 findFragemtByTag 检索它
  • 用相关代码更新问题。

标签: android eclipse android-fragments android-fragmentactivity


【解决方案1】:

你必须这样做:

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

【讨论】:

  • 你能详细说明一下吗?我应该把这个放在哪里?片段变量是我的片段之一吗?
【解决方案2】:

你可以通过标签找到你的片段,当然你需要在添加片段时给它这个标签。

首先用标签添加你的片段:

        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();

【讨论】:

  • 我不确定如何实现你的方法。我已经用我的代码更新了这个问题。显然,我没有使用 fragmentTransaction 将 Fragment 添加到管理器。
  • 它不工作。发生错误:“无法更改片段的标签”。请看我的相关问题:stackoverflow.com/questions/24833912/…
  • 如果您的应用支持 v4,请使用 getSupportFragmentManager()。
  • 这是唯一的方法吗?为什么不将片段实例保存在活动类的属性中?
【解决方案3】:

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

  1. 覆盖适配器中的 getItemPosition

    @Override
    public int getItemPosition(Object object) {
        // POSITION_NONE makes it possible to reload the PagerAdapter
        return POSITION_NONE;
    }
    
  2. 一旦你做了那个电话

    mViewPager.getAdapter.notifyDataSetChanged();
    

    在您的活动中。从片段对象本身,您可以使用回调来通知 Activity 需要刷新。

这将使用片段的新实例重新填充 viewPager,这就像重新启动/刷新片段一样。

希望对您有所帮助,这正是您所寻找的。​​p>

【讨论】:

    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-08-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多