SLaks
2013-04-23 10:04
采纳率: 60.5%
浏览 25.1k

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

  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

8条回答 默认 最新

  • _houzhi 2014-11-23 03:09
    已采纳

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

    打赏 评论
  • 蝶彩科技 2014-11-20 15:02

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

    打赏 评论
  • 技术力量猛于虎 2014-11-27 02:10

    http://download.csdn.net/detail/u013372185/8075709 你可以看看这个链接,这个项目里面也是用的ViewPager,但是我项目中切换view用的是ViewFlipper。。。不过和ViewPager差不多,

    打赏 评论
  • alan_zangxu 2014-12-15 12:00

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

    打赏 评论
  • ZhuoZhuoWei 2014-12-22 04: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);
    }
    

    }

    打赏 评论
  • 浓浓斯蒂芬 2015-01-02 14:36

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

    打赏 评论
  • androidstarjack 2015-01-04 06: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){}
    }
    

    }

    打赏 评论
  • projectM 2015-01-04 09:28

    private int currentPageIndex = 0; // 当前page索引(切换之前)

    打赏 评论

相关推荐 更多相似问题