Fragment之间的切换

     背景和要求:在一个FragmentA中设置一个View的监听,当这个view被点击时,就进入FragmentB,然后当点击FragmentB中的某个view的时候要重新返回到FragmentA中。这个就是类似于网易云音乐的切换歌词显示的效果。
     首先有一个MusicPlayFragment类,该类继承了抽象类AbsMusicPlayFragment,他主要完成音乐播放的一些逻辑,因为主要不是讲这个所以省略。在该类中onCreateMusicPlayView()方法主要负责播放界面的显示,同时还设置了切换到歌词显示的监听。
public class MusicPlayFragment extends AbsMusicPlayFragment
{
    private LyricShowFragment lyricFragment;
    @Override
    protected View onCreateMusicPlayView(LayoutInflater inflater, ViewGroup container)
    {
        // TODO Auto-generated method stub
        lyricFragment = new LyricShowFragment();
        View view = inflater.inflate( R.layout.fragment_music_play, container, false );
        ImageView image = (ImageView) view.findViewById(R.id. iv_album);
        image.setOnClickListener( lyricShowListener);
        return view;
    }
   
    /**
     * 切换Fragment监听
     */
    private OnClickListener lyricShowListener = new OnClickListener() {
       
        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            switchToFragment(R.id.fragment_music_play_panel ,lyricFragment ,true);
        }
    };

    /**
     *
      * TODO:切换到歌词显示Fragment
      * @param: containerViewId Fragment被添加到的容器id
      * dfragment 被添加的Fragment
      * isAddedStack 是否被加入到BackStack 的标识符,在这里一定要被添加的。
      * @author: zhuzhipeng
      * @version: 2014- 7-3
     */
    public void switchToFragment(int containerViewId ,Fragment dfragment, boolean isAddedStack){
            FragmentTransaction ft = getFragmentManager().beginTransaction();
            ft.add(containerViewId , dfragment);
            ft.setTransition(FragmentTransaction. TRANSIT_FRAGMENT_OPEN);
            if(isAddedStack)
                ft.addToBackStack( null);
            ft.commit();
    }
}
        这里主要看switchToFragment()方法,它的第一个参数dcontainerViewId指的是Fragment被添加在的容器标识符;第二个参数就是添加的Fragment;第三个参数是用于标识Fragment是否被放入回退栈。
     注意switchToFragment()方法中,添加Fragment中是采用add()方法添加,也可以采用replace()方法,但是replace()方法会先调用remove()方法,然后调用add()方法。如果使用replace()方法,当通过FragmentManager的popBackStack()方法弹出栈顶的Fragment时,就会出现空视图,因为之前的Fragment都被remove掉了。
     显示歌词的Fragment(只是界面的显示模拟)如下:
public class LyricShowFragment extends Fragment {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        View view = inflater.inflate(R.layout. fragment_lyric, container, false);
        initView(view);
        return view;
    }

    private void initView(View view) {
        view.findViewById(R.id.lyric_fragment ).setOnClickListener(backToMusicPlayListener);
       
    }

    private OnClickListener backToMusicPlayListener = new OnClickListener() {
       
        @Override
        public void onClick(View v) {
            getFragmentManager(). popBackStack();
        }
    };
}
      这里只是在onClick()方法中调用了popBackStack()方法,将栈顶的Fragment弹出,显现出来的就是之前的Fragment了。因为这里只用到了两个fragment,所以可以调用该无参数方法,如果在多个fragment间切换,可以调用对应的有参方法。


你可能感兴趣的:(fragment之间切换)