![](/img/trans.png)
[英]How to use same Fragment class multiple times in a ViewPager and TabLayout?
[英]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.