簡體   English   中英

在ViewPager中使用相同的Fragment類

[英]Use same Fragment class in ViewPager

我有一個ViewPager ,我想為其所有Views使用相同的Fragment類型,但是我遇到了問題。 實際上只有第一個View被更新。 如果向左/向右滑動,我會得到一個空的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
}

我怎樣才能解決這個問題?

我已經解決了這個問題。 問題是我正在使用getActivity().findViewById()並且始終使視圖在ViewPager上可見。 我從onActivityCreated切換到onViewCreated ,現在我使用onViewCreated提供的onViewCreated作為參數來通過id來獲取我的視圖,例如view.findViewById() ……現在它可以完美運行了。謝謝!

如果您嘗試使用onViewCreated()而不是onActivityCreated()怎么辦? 這是我在您的代碼中看到的唯一不尋常的事情。

您正在“ getItem(int position)”方法中創建單個片段。 在ScreenSlidePagerAdapter構造函數中傳遞一些片段數組,並在getItem方法中從該數組獲取片段。 看看:在這里輸入鏈接描述

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM