android - 用 fragment 替换 ViewPager - 然后导航回来

标签 android android-fragments android-viewpager fragmentpageradapter

我有一个 Activity ,它最初托管一个 ViewPager,连接到 FragmentPagerAdapter。

当用户单击 ViewPager 的子 fragment 中的项目时,我正在使用 FragmentTransaction 将空容器 View 替换为要导航到的新 fragment 。

如果我在事务上使用 addToBackStack(),提交事务然后返回,我不会返回到 ViewPager 的 View (初始布局)。

如果我不在事务上使用 addToBackStack(),提交事务然后返回,应用程序退出。

ViewPager 似乎没有添加到后台堆栈中(这并不奇怪,因为它本身不是一个 fragment )。但我希望默认行为是后台按下将我带回即 Activity 初始 View (ViewPager)。

根据我读到的内容,似乎可能是因为 fragment 事务正在发生,ViewPager 或 PagerAdapter 失去了对应该显示哪个 fragment 的跟踪。

我真的对此感到困惑,但我最终创建了一大堆代码来覆盖 onBackPress 并显示和隐藏 viewpager View 。我会认为有一种更简单的方法可以使用默认行为来执行适当的导航。

tl;博士

A 是一个 Viewpager 托管 fragment 。 B 是一个新的 Fragment。

当我将 A 替换为 B,然后按返回时,我希望导航回 A,但这并没有发生。

任何建议将不胜感激。

代码:

主 Activity :

  @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);

        headingLayout = (RelativeLayout) findViewById(R.id.headingLayout);
        headingLayout.setVisibility(View.GONE);

        // Set up the ViewPager, attaching the adapter and setting up a listener
        // for when the
        // user swipes between sections.
        mViewPager = (ViewPager) findViewById(R.id.pager);

        mViewPager.setPageMargin(8);

        /** Getting fragment manager */
        FragmentManager fm = getSupportFragmentManager();

        /** Instantiating FragmentPagerAdapter */
        MyFragmentPagerAdapter pagerAdapter = new MyFragmentPagerAdapter(fm);

        /** Setting the pagerAdapter to the pager object */
        mViewPager.setAdapter(pagerAdapter);
.
.
.
}

    public void onListItemClicked(Fragment fragment) {
        fromPlayer = false;
        InitiateTransaction(fragment, true);

    }


    public void InitiateTransaction(Fragment fragment, boolean addToBackStack) {

        invalidateOptionsMenu();

        FragmentManager fm = getSupportFragmentManager();
        FragmentTransaction ft = fm.beginTransaction();

        ft.replace(R.id.fragmentContainer, fragment).addToBackStack(null)
                .commit();

    }

PagerAdapter:

package another.music.player;

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import another.music.player.fragments.AlbumListFragment;
import another.music.player.fragments.ArtistListFragment;
import another.music.player.fragments.SongListFragment;

public class MyFragmentPagerAdapter extends FragmentPagerAdapter {

    final int PAGE_COUNT = 3;

    /** Constructor of the class */
    public MyFragmentPagerAdapter(FragmentManager fm) {
        super(fm);
    }

    /** This method will be invoked when a page is requested to create */
    @Override
    public Fragment getItem(int i) {
        switch (i) {
        case 0:
            ArtistListFragment artistListFragment = new ArtistListFragment();
            Bundle artistData = new Bundle();
            artistData.putInt("current_page", i + 1);
            artistListFragment.setArguments(artistData);
            return artistListFragment;

        case 1:
            AlbumListFragment albumListFragment = new AlbumListFragment();
            Bundle albumData = new Bundle();
            albumData.putInt("current_page", i + 1);
            albumData.putBoolean("showHeader", false);
            albumListFragment.setArguments(albumData);
            return albumListFragment;

        default:

            SongListFragment songListFragment = new SongListFragment();
            Bundle songData = new Bundle();
            songData.putInt("current_page", i + 1);
            songListFragment.setArguments(songData);
            return songListFragment;
        }
    }

    /** Returns the number of pages */
    @Override
    public int getCount() {
        return PAGE_COUNT;
    }

    @Override
    public CharSequence getPageTitle(int position) {
        switch (position) {
        case 0:
            return "Artists";

        case 1:
            return "Albums";

        default:
            return "Songs";
        }
    }
}

主xml(包含fragmentContainer & ViewPager):

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/main_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@drawable/app_background_ics" >

    <RelativeLayout
        android:id="@+id/headingLayout"
        android:layout_width="match_parent"
        android:layout_height="56dp" >
    </RelativeLayout>

    <FrameLayout
        android:id="@+id/fragmentContainer"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_below="@+id/headingLayout" />

    <android.support.v4.view.ViewPager
        android:id="@+id/pager"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent" >

        <android.support.v4.view.PagerTabStrip
            android:id="@+id/pager_title_strip"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="#33b5e5"
            android:paddingBottom="4dp"
            android:paddingTop="4dp"
            android:textColor="#fff" />
    </android.support.v4.view.ViewPager>

</RelativeLayout>

最佳答案

我也有同样的问题很长一段时间。解决方案非常简单,您不需要任何对 ViewPager Visibility 的修改。我在另一个与 SO 相关的问题中有所描述:Fragment in ViewPager not restored after popBackStack

但是,为了简单起见,您只需在 ViewPager 适配器中使用 getChildFragmentManager(),而不是 getSupportFragmentManager()。所以,而不是这个:

    /** Getting fragment manager */
    FragmentManager fm = getSupportFragmentManager();

    /** Instantiating FragmentPagerAdapter */
    MyFragmentPagerAdapter pagerAdapter = new MyFragmentPagerAdapter(fm);

    /** Setting the pagerAdapter to the pager object */
    mViewPager.setAdapter(pagerAdapter);

你这样做:

    /** Getting fragment manager */
    FragmentManager fm = getChildFragmentManager();

    /** Instantiating FragmentPagerAdapter */
    MyFragmentPagerAdapter pagerAdapter = new MyFragmentPagerAdapter(fm);

    /** Setting the pagerAdapter to the pager object */
    mViewPager.setAdapter(pagerAdapter);

关于android - 用 fragment 替换 ViewPager - 然后导航回来,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12490963/

相关文章:

Android 无法在 Windows 7 上运行

android-gallery 如何设置被选中的 child 的位置

android - 在 SD 卡上安装自签名 apk 时出现 "Application not installed"

android - 如何在 ViewPager 中禁用特定页面滑动

java - Android Viewpager 为空

android - 更新 android chrome 版本 65 后,应用程序无法运行,Sencha touch 和 cordova android

android - 在使用自定义动画的 fragment 替换事务正在运行时暂停 Activity 时的幽灵行为

android - fragment - 获取 View 在调用 onCreateView 时已经有父错误

android - 共享元素结束监听器

android - 从 viewpager 中的特定 fragment 隐藏工具栏和标签布局