2 slaks SLaks 于 2013.04.23 18:04 提问

把ViewPager 从一个fragment切换到另一个fragment中

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相似。

14个回答

xxx_zhi
xxx_zhi   2014.11.23 11:09
已采纳

没明白你那switching 的意思,是不能切换fragment ?有没有可能是你的代码有问题? OnChangePageButtonClick 设置那一设置错了item index ?

liaoliao2008
liaoliao2008   2014.11.20 23:02

亲 问题 没说明白啊
到底想问什么呢

q297299899
q297299899   2014.11.24 13:12

我也搞不懂问题在哪....

alan_zangxu
alan_zangxu   2014.12.15 20:00

有没有可能是你的代码有问题? OnChangePageButtonClick 设置那一设置错了item index ?

qq_24568033
qq_24568033   2014.12.16 20:16

有没有可能是你的代码有问题? OnChangePageButtonClick 设置那一设置错了item index

caron991
caron991   2014.12.19 18:51

我也是没有搞懂问题是什么

ZhuoZhuoWei
ZhuoZhuoWei   2014.12.22 12:20

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);
}

}

qq_21555803
qq_21555803   2014.12.24 10:20

demo修改了一下 ,加QQ841143577

demo修改了一下 ,加QQ841143577

demo修改了一下 ,加QQ841143577

u014526207
u014526207   2015.01.02 22:36

如果是数据消失了。你就去看一下fragment的生命周期。生命周期很多问题。翻两页,前一页的数据就会重新赋值。

androidstarjack
androidstarjack   2015.01.04 14:56

请参考这个类,解决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){}
}

}

共14条数据 1 尾页
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!