【问题标题】:How to replace fragment from ViewPager with a new one如何用新片段替换 ViewPager 中的片段
【发布时间】:2017-10-17 09:58:59
【问题描述】:

我发现了很多类似的问题和很多不同的答案,但没有一个对我有帮助。如果可能的话,我会尝试发布一个明确的问题以获得明确的答案。

所以我有一个 Activity,它有一个带有 FragmentStatePagerAdapter 的 ViewPager,它(目前)只包含一个片段(HomeScreenFragment)。

在 HomeScreenFragment 内部,我有一个 RecyclerView,其中包含几种不同图标的列表,这些图标应该为每个项目单击打开不同的片段。

HomeScreenFragment 有一个 FrameLayout 作为 id 名称为“container”的根布局。在这种情况下,这是我调用用 MainTypesFragment 替换 HomeScreenFragment 的方法:

 private void openAllTypesFragment() {
    MainTypesFragment fragment = new MainTypesFragment();
    FragmentTransaction transaction = getActivity().getSupportFragmentManager().beginTransaction();
    transaction.replace(R.id.container, fragment);
    transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
    transaction.addToBackStack(HomeScreenFragment.class.getName());
    transaction.commit();
    eventBus.post(new Event(null, Event.EVENT_FRAGMENT));
}

由于 FragmentStatePagerAdapter 在 MainActivity 中初始化,我正在发送一个事件,该事件将 MainActivity 捕获并调用 adapter.notifyDataSetChanged();

这样做,没有任何反应。我尝试使用 getChildFragmentManager() 而不是 getActivity().getSupportFragmentManager(),在这种情况下,前一个片段 (HomeScreenFragment) 在新片段 (MainTypesFragment) 下方可见..

任何想法我在这里做错了什么?

【问题讨论】:

  • 你想替换之前的片段还是只打开旧片段之上的新片段?
  • 我想在 viewpager (HomeScreenFragment) 中有 2 个片段,可以用几个不同的可能片段替换,具体取决于 RecyclerView 项目单击的类型,一个片段始终作为 viewpager 中的第二个片段存在
  • 如果我正确理解你需要为每个页面单独的片段堆栈?就像您单击 page1 列表项 1 并会在 page1 列表上方出现新片段?
  • 我将尝试更好地描述它:假设 viewpager 中的第一个片段是 MovieFragment,第二个片段是 ActorsFragment。如果单击 MovieFragment 中的电影项目,MovieFragment 应替换为 MovieDetails 片段,但 ActorsFragment 保留为 viewpager 中的第二个片段。它不应该在上面。整个片段应该替换为新片段

标签: android android-fragments fragmenttransaction fragmentstatepageradapter


【解决方案1】:

您使用的容器错误。在activity xml中维护一个容器并使用该容器加载所有片段。

transaction.replace(R.id.container, fragment);

这里的容器是应该存在viewpager和其他视图的活动容器。

【讨论】:

  • 但在那种情况下,我会用新片段替换整个浏览器,对吧?我想在 viewpager 中有 2 个片段,并且只能根据在其中单击的项目类型替换第一个片段...例如,当应用程序运行时,我在 viewpager 中有一个 HomeScreenFragment 和 SecondFragment。在我单击 HomeScreenFragment 中的一项后,它应该被 MainTypesFragment 替换,但 SecondFragment 应该保持不变.. 这有可能实现吗?
  • 那么你必须在 xml 中为与 HomeScreenFragment 视图匹配的那个空间保留一个 frameLayout,然后你就可以替换了。如果你添加代码,我可以说清楚。
  • 实际上更好的解决方案将是您建议的方式。所以我在 FrameLayout 中有一个 ID 为 fragment_container 的 ViewPager。当我调用 replace 方法时,我将该 id 作为第一个参数,但它并不能很好地替换它。我可以看到新的 Fragment,但前一个主要的仍然在新的 Fragment 下可见(来自 ViewPager 的那个)。 ..
  • 默认情况下,片段将具有透明背景..您需要通过添加背景来覆盖它。我认为您的问题已解决:)
  • 是的!谢谢你,先生!但是,现在的问题是,我的新片段应该是透明的! :) 还有其他方法吗?
【解决方案2】:

你可以试试我的代码:

    private void addFilmDetailFragment(Movie movie){
        android.support.v4.app.FragmentManager fragmentManager = getFragmentManager();
        android.support.v4.app.FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();

        FilmDetailFragment fragment = new FilmDetailFragment();

        Bundle bundle = new Bundle();
        bundle.putParcelable("movie", movie);  // Key, value
        fragment.setArguments(bundle);

        fragmentTransaction.replace(R.id.mainContentStore, fragment);
//        fragmentTransaction.replace(R.id.mainContent, fragment, Config.TAG_FILM_DETAIL);
        fragmentTransaction.addToBackStack(null);
        fragmentTransaction.commit();
    }

在 viewpager 的片段中:

<?xml version="1.0" encoding="utf-8"?> 

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/mainContentStore"
    android:layout_width="match_parent"
    android:layout_gravity="center"

    android:layout_height="match_parent">

    <android.support.v7.widget.RecyclerView
        android:id="@+id/recyclerFilm"
        android:layout_gravity="center"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />


</FrameLayout>

它对我有用,我希望它能帮助你解决问题!

【讨论】:

  • 您能否提供一些有关您正在使用的结构和 ID 的信息? “mainContentStore” id 是您当前的根布局还是框架布局 viewpager 在里面?
  • 但是您要替换的片段不在 ViewPager 中,对吧?您只是用新片段替换常规片段?
【解决方案3】:

您需要ViewPager 和内部片段(页面)的容器内部活动,用于在页面内打开新片段的容器。

如果你想打开新的片段,你应该使用这样的东西 在页面片段中

getChildFragmentManager().beginTransaction()
      .replace(R.id.page_fragment_container, fragment)
      .addToBackStack(name)
      .commit()

R.id.page_fragment_container 容器在页面片段内的位置。

【讨论】:

  • 它可以工作,但是 HomeScreenFragment(来自 ViewPager 的那个)在新的屏幕下仍然可见...
  • 为新片段添加背景,并在android:clickable="true" 中为根布局添加背景。如果您需要机会回到上一个片段。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-18
  • 1970-01-01
  • 2014-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多