在 ViewPager 中使用相同的片段 class

Use same Fragment class in ViewPager

我有一个 ViewPager,我想对所有 Views 使用相同的 Fragment 类型,但我遇到了问题。实际上只有第一个 View 被更新。如果我滑动到 left/right,我得到一个空的 Fragment,如果我向后滑动,我可以看到应该在第一次滑动中实例化的 Fragment 在那里实例化了,我有点困惑..这是我的代码: Activity :

public class HymnSwipe extends ActionBarActivity {
    private static final int NUM_PAGES = 900;
    private ViewPager mPager;
    private PagerAdapter mPagerAdapter;
    PrefManager prefs;

    int startNumber;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        BarColorizer bar = new BarColorizer(this);
        prefs = new PrefManager(this);
        if (prefs.getNightMode()) {
            setTheme(R.style.Theme_AppCompat);
            bar.setColor(R.color.grey_900);
        } else {
            bar.setTheme();
        }

        super.onCreate(savedInstanceState);
        setContentView(R.layout.fragment_hymn_slider);

        if (android.os.Build.VERSION.SDK_INT >= 11) {
            bar.setActivity(this);
        }

        startNumber = getIntent().getExtras().getInt("number");

        // Instantiate a ViewPager and a PagerAdapter.
        mPager = (ViewPager) findViewById(R.id.vpHymnPager);
        mPagerAdapter = new ScreenSlidePagerAdapter(getSupportFragmentManager());
        mPager.setAdapter(mPagerAdapter);
        mPager.setCurrentItem(startNumber, true);
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    }
    private class ScreenSlidePagerAdapter extends FragmentPagerAdapter {
        public ScreenSlidePagerAdapter(FragmentManager fm) {
            super(fm);
        }

        @Override
        public int getCount() {
            return NUM_PAGES;
        }

        @Override
        public Fragment getItem(int position) {
            return FragmentShowHymn.newInstance(position);
        }
    }
}

片段:

public class FragmentShowHymn extends Fragment implements View.OnTouchListener, View.OnKeyListener {
    private int mHymnNumber;

    TextView tvTitle, tvHymn, tvCategory, tvGama;
    ImageView ivSheet, ivMP3;
    SeekBar hymnTextSize;
    LinearLayout llImageButtons;

    ImageButton ibPlayPause, ibStop;
    Bitmap bmpPlay, bmpPause, bmpStop, heart;
    boolean ibPlayPauseIsOnPlay = true;
    SoundProcessor sound;
    public static ProgressDialog progress;
    Menu menu;
    boolean isFavorited = false;

    String hymnNumber;

    DatabaseHelper database;

    boolean textReady = false;

    ImageProcessor ip;
    File musicSheet;

    int mediaButtons, sheetAndMediaButtons;

    Intent sharingIntent = null;
    public static boolean isMusicPlaying = false;

    PrefManager prefs;

    // pinchZoom
    final static float STEP = 200;
    float mRatio = 1.0f;
    int mBaseDist;
    float mBaseRatio;
    float maxFontSize = 50;

    GestureDetector gestureDetector;

    ScrollView swScroll;

    PowerManager.WakeLock wakeLock;

    public FragmentShowHymn() {

    }

    public FragmentShowHymn(int hymnNumber) {
        mHymnNumber = hymnNumber;
    }

    public static FragmentShowHymn newInstance(int position) {
        FragmentShowHymn fragmentShowHymn = new FragmentShowHymn();
        Bundle args = new Bundle();
        args.putInt("hymnNumber", position);
        fragmentShowHymn.setArguments(args);
        return fragmentShowHymn;
    }

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.activity_show_hymn, container, false);
        return v;
    }

    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        DisplayMetrics dm = new DisplayMetrics();
        getActivity().getWindowManager().getDefaultDisplay().getMetrics(dm);
        int width = dm.widthPixels;
        int height = dm.heightPixels;

        mediaButtons = width / 6;
        sheetAndMediaButtons = width / 6;

        prefs = new PrefManager(getActivity());

        mHymnNumber = getArguments().getInt("hymnNumber");

        init();
        showText();
        initShare();
    }
    //other methods for initializing views
}

我该如何解决这个问题?

您正在 "getItem(int position)" 方法中创建单个片段。在 ScreenSlidePagerAdapter 构造函数中传递一些片段数组,并在 getItem 方法中从该数组中获取片段。 看看这个: enter link description here

我已经解决了这个问题。问题是我正在使用 getActivity().findViewById(),并且总是在 ViewPager 上看到视图。我从 onActivityCreated 切换到 onViewCreated,现在我使用 onViewCreated 提供的视图作为参数,通过 id 获取我的视图,就像这样 view.findViewById()... 现在它完美运行..谢谢!

如果您尝试使用 onViewCreated() 而不是 onActivityCreated() 会怎样?这是我在您的代码中看到的唯一不寻常的地方。