Viewpager 中有两个pages,在每一个 fragment中,我放入一个按钮到switching fragment中,但是如果我改变方向,switching不能运行。对于switching fragment,我使用的是 OnChangePageButtonClick 接口。为什么会出现这种情况呢?
ViewPager Activity:
public class ViewPagerMusic extends FragmentActivity implements OnChangePageButtonClick {
private ViewPager vp;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.view_pager_music);
ViewPagerAdapter viewPagerAdapter = new ViewPagerAdapter(super.getSupportFragmentManager(), fragments);
vp = (ViewPager)findViewById(R.id.viewpager);
vp.setAdapter(viewPagerAdapter);
}
private class ViewPagerAdapter extends FragmentStatePagerAdapter {
public ViewPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int position) {
switch(position) {
case 0:
MainPage mainPage = new MainPage();
mainPage.setOnChengeButtonListener(ViewPagerMusic.this);
return mainPage;
case 1:
PlaylistPage playlistPage = new PlaylistPage();
playlistPage.setOnChengeButtonListener(ViewPagerMusic.this);
return playlistPage;
}
return null;
}
@Override
public int getCount() {
return 2;
}
}
@Override
public void selectPage(int page) {
vp.setCurrentItem(page);
}
}
Frgamnets:
public class MainPage extends Fragment {
public MainPage() {
setRetainInstance(true);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.music_main_page, container, false);
ImageButton btnPlaylist = (ImageButton)v.findViewById(R.id.btnGoPlaylist2);
btnPlaylist.setOnClickListener(onButtonListener);
return v;
}
private OnClickListener onButtonListener = new OnClickListener() {
@Override
public void onClick(View view) {
onChangePageButtonClick.selectPage(1);
}
};
public void setOnBackButtonListener(OnChangePageButtonClick onChangePageButtonClick) {
this.onChangePageButtonClick = onChangePageButtonClick;
}
private OnChangePageButtonClick onChangePageButtonClick;
}
Playlist fragment 与 MainPage fragment相似。
没明白你那switching 的意思,是不能切换fragment ?有没有可能是你的代码有问题? OnChangePageButtonClick 设置那一设置错了item index ?
亲 问题 没说明白啊
到底想问什么呢
http://download.csdn.net/detail/u013372185/8075709 你可以看看这个链接,这个项目里面也是用的ViewPager,但是我项目中切换view用的是ViewFlipper。。。不过和ViewPager差不多,
有没有可能是你的代码有问题? OnChangePageButtonClick 设置那一设置错了item index ?
public class ViewPagerCompat extends ViewPager {
//mViewTouchMode表示ViewPager是否全权控制滑动事件,默认为false,即不控制
private boolean mViewTouchMode = false;
public ViewPagerCompat(Context context, AttributeSet attrs) {
super(context, attrs);
}
public void setViewTouchMode(boolean b) {
if (b && !isFakeDragging()) {
//全权控制滑动事件
beginFakeDrag();
} else if (!b && isFakeDragging()) {
//终止控制滑动事件
endFakeDrag();
}
mViewTouchMode = b;
}
/**
* 在mViewTouchMode为true的时候,ViewPager不拦截点击事件,点击事件将由子View处理
*/
@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
if (mViewTouchMode) {
return false;
}
return super.onInterceptTouchEvent(event);
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
try {
return super.onTouchEvent(ev);
} catch (Exception e) {
return false;
}
}
/**
* 在mViewTouchMode为true或者滑动方向不是左右的时候,ViewPager将放弃控制点击事件,
* 这样做有利于在ViewPager中加入ListView等可以滑动的控件,否则两者之间的滑动将会有冲突
*/
@Override
public boolean arrowScroll(int direction) {
if (mViewTouchMode) return false;
if (direction != FOCUS_LEFT && direction != FOCUS_RIGHT) return false;
return super.arrowScroll(direction);
}
}
如果是数据消失了。你就去看一下fragment的生命周期。生命周期很多问题。翻两页,前一页的数据就会重新赋值。
请参考这个类,解决fragMent的图activity之间的问题
public class FragmentViewpageAdapter extends PagerAdapter implements ViewPager.OnPageChangeListener{
private List fragments; // 每个Fragment对应一个Page
private FragmentManager fragmentManager;
private ViewPager viewPager; // viewPager对象
private int currentPageIndex = 0; // 当前page索引(切换之前)
private OnExtraPageChangeListener onExtraPageChangeListener; // ViewPager切换页面时的额外功能添加接口
public FragmentViewpageAdapter(FragmentManager fragmentManager, ViewPager viewPager , List<Fragment> fragments) {
this.fragments = fragments;
this.fragmentManager = fragmentManager;
this.viewPager = viewPager;
this.viewPager.setAdapter(this);
this.viewPager.setOnPageChangeListener(this);
}
@Override
public int getCount() {
return fragments.size();
}
@Override
public boolean isViewFromObject(View view, Object o) {
return view == o;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
container.removeView(fragments.get(position).getView()); // 移出viewpager两边之外的page布局
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
Fragment fragment = fragments.get(position);
if(!fragment.isAdded()){ // 如果fragment还没有added
FragmentTransaction ft = fragmentManager.beginTransaction();
ft.add(fragment, fragment.getClass().getSimpleName());
ft.commit();
/**
* 在用FragmentTransaction.commit()方法提交FragmentTransaction对象后
* 会在进程的主线程中,用异步的方式来执行。
* 如果想要立即执行这个等待中的操作,就要调用这个方法(只能在主线程中调用)。
* 要注意的是,所有的回调和相关的行为都会在这个调用中被执行完成,因此要仔细确认这个方法的调用位置。
*/
fragmentManager.executePendingTransactions();
}
if(fragment.getView().getParent() == null){
container.addView(fragment.getView()); // 为viewpager增加布局
}
return fragment.getView();
}
/**
* 当前page索引(切换之前)
* @return
*/
public int getCurrentPageIndex() {
return currentPageIndex;
}
public OnExtraPageChangeListener getOnExtraPageChangeListener() {
return onExtraPageChangeListener;
}
/**
* 设置页面切换额外功能监听器
* @param onExtraPageChangeListener
*/
public void setOnExtraPageChangeListener(OnExtraPageChangeListener onExtraPageChangeListener) {
this.onExtraPageChangeListener = onExtraPageChangeListener;
}
@Override
public void onPageScrolled(int i, float v, int i2) {
if(null != onExtraPageChangeListener){ // 如果设置了额外功能接口
onExtraPageChangeListener.onExtraPageScrolled(i, v, i2);
}
}
@Override
public void onPageSelected(int i) {
fragments.get(currentPageIndex).onPause(); // 调用切换前Fargment的onPause()
// fragments.get(currentPageIndex).onStop(); // 调用切换前Fargment的onStop()
if(fragments.get(i).isAdded()){
// fragments.get(i).onStart(); // 调用切换后Fargment的onStart()
fragments.get(i).onResume(); // 调用切换后Fargment的onResume()
}
currentPageIndex = i;
if(null != onExtraPageChangeListener){ // 如果设置了额外功能接口
onExtraPageChangeListener.onExtraPageSelected(i);
}
}
@Override
public void onPageScrollStateChanged(int i) {
if(null != onExtraPageChangeListener){ // 如果设置了额外功能接口
onExtraPageChangeListener.onExtraPageScrollStateChanged(i);
}
}
/**
* page切换额外功能接口
*/
static class OnExtraPageChangeListener{
public void onExtraPageScrolled(int i, float v, int i2){}
public void onExtraPageSelected(int i){}
public void onExtraPageScrollStateChanged(int i){}
}
}
private int currentPageIndex = 0; // 当前page索引(切换之前)