一个Activity管理多个Fragment切换

本文介绍如何在一个Activity中管理多个Fragment进行切换,避免创建新Activity。主要思路是创建一个主Fragment,通过它来打开其他Fragment,并利用回退栈管理Fragment的显示与隐藏。在切换Fragment时,可以更新标题栏内容,但回退时标题栏内容不变。提供了完整的Demo供下载参考。

这里写图片描述

先放效果图。

有些时候需要整个页面改变,但是又没必要创建一个新的Activity,这时候可以使用这个方法。大致思路是,创建的第一个界面为主界面,通过这个界面打开其它的Fragment。主界面的Fragment是在MainActivity里面创建的,其它的Fragment是在主Fragment的java文件中创建。创建一个新的Fragment的时候把当前的Fragment隐藏,加入回退栈,这样按下返回键时会回退到上一个Fragment。如果不加入回退栈,则会执行onStop。其实还可以更改标题栏内容,这个Demo没有做,下面简单说下方法。使用getActivity()获取到当前的Activity。其实就创建了一个。然后使用setTitle()方法,更改标题栏内容。
注意:这个时候如果回退到上一个Fragmetn,标题栏内容依然是更改后的内容,标题栏的操作与Fragment的回退无关。
Java文件与XML文件比较多,在这里只贴出主Fragment的代码,整个工程文件打包提供下载。

  public class mainFragment extends Fragment {
    String TAG = "TAG";
    Handler mHandler;
    View view = null;
    MainActivity mainActivity;
    FragmentManager fm;
    FragmentTransaction transaction;
    Button mFirstBt;
    Button mSecondBt;
    Button mThreadBt;
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        view = inflater.inflate(R.layout.main, container, false);
        //mHandler = mainActivity.mHandler;
        //绑定界面的按钮  实现按钮的点击事件
        findview();
        Log.i(TAG, "显示主Fragment");
        return view;
    }

    private void findview() {

        // 绑定主Fragment里面的三个按钮
        mFirstBt = (Button) view.findViewById(R.id.firstbt);
        mSecondBt = (Button) view.findViewById(R.id.secondbt);
        mThreadBt = (Button) view.findViewById(R.id.threadbt);
        Log.i(TAG, "按钮绑定");
        mFirstBt.setOnClickListener(new btOnclick());
        mSecondBt.setOnClickListener(new btOnclick());
        mThreadBt.setOnClickListener(new btOnclick());
    }

    class btOnclick implements OnClickListener {

        @Override
        public void onClick(View v) {
            switch (v.getId()) {
            case R.id.firstbt:
                // 点击第一个按钮  创建第一个Fragment
                selectFM(1);
                break;
            case R.id.secondbt:
                // 点击第二个按钮  创建第二个Fragment
                selectFM(2);
                break;
            case R.id.threadbt:
                // 点击第三个按钮  创建第三个Fragment
                selectFM(3);
                break;
            default:
                break;
            }
        }

    }

    void selectFM(int i) {
        fm = getFragmentManager();
        transaction = fm.beginTransaction();
        switch (i) {
        case 1:
            FirstFragment fm_first = new FirstFragment();
            transaction.hide(this);
            transaction.add(R.id.id_content, fm_first);
            transaction.addToBackStack(null);
            Log.i("TAG", "进入port");
            break;
        case 2:
            SecondFragment fm_second = new SecondFragment();
            transaction.hide(this);
            transaction.add(R.id.id_content, fm_second);
            transaction.addToBackStack(null);
            break;
        case 3:
            ThreadFragment fm_thread = new ThreadFragment();
            transaction.hide(this);
            transaction.add(R.id.id_content, fm_thread);
            transaction.addToBackStack(null);
            break;
        default:
            break;
        }
        transaction.commit();
    }
}  

在改变标题栏或者在标题栏加入返回功能遇到问题的请留言
Demo链接:http://pan.baidu.com/s/1hsLd6Hu 密码:ir10

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值