在 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()
会怎样?这是我在您的代码中看到的唯一不寻常的地方。
我有一个 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()
会怎样?这是我在您的代码中看到的唯一不寻常的地方。