android activity与多个fragment之间的瓜葛

activity与fragment加载并传递参数实践

  • activity 加载基础fragment
  • fragment 传递参数给activity
  • activity 传递参数给fragment
  • fragment 替换另一个fragment(replace)
  • fragment 回退栈处理
activity 加载基础fragment

使用 fragmentManage来进行fragment的加载

    fragmentManager = getSupportFragmentManager();
        android.support.v4.app.FragmentTransaction tx =fragmentManager.beginTransaction();
        //加载fragment1
        if (fragment1 == null) {
            fragment1 = new TravelMessageFragment1();
            tx.add(R.id.travelInit, fragment1);
            tx.addToBackStack(null);
            tx.commit();
        }

注意:activity 加载每个fragment 时 必须使用不同的事务,所以每次添加或替换必须再声明次 FragmentTransaction
如下所示:

 android.support.v4.app.FragmentTransaction tx =fragmentManager.beginTransaction();
        fragment2 = new TravelMessageFragment2();
        tx.replace(R.id.travelInit, fragment2);
        tx.addToBackStack(null);
        tx.commit();
fragment 传递参数给activity

可以使用2种方式进行传递

  • 使用广播方式
  • 使用回调机制 (可以查看 android回调机制 )

这里就不介绍回调机制如何处理了,着重看数据如何传递

public  interface TravelMessageFragmentListener{
        //添加fragment2
        void addFragment2(HashMap saveData);
    }

这里的saveData 就是需要传递的数据,需要做2件事

  • fragment 确定什么时候发起传输数据到activity
  • activity 怎么接收该数据并替换为另一个fragment并传递参数给这个fragment

这里的activity需要实现该接口并重写该方法

public void addFragment2 (HashMap saveData) {
        initToolBar();
        android.support.v4.app.FragmentTransaction tx =fragmentManager.beginTransaction();
        fragment2 = new TravelMessageFragment2();
        tx.replace(R.id.travelInit, fragment2);
        tx.addToBackStack(null);
        tx.commit();
        fragment2.putData(saveData);
    }
activity 传递参数给fragment

这里可以使用fragment2.putData(saveData);来传递数据

fragment 替换另一个fragment(replace)
android.support.v4.app.FragmentTransaction tx =fragmentManager.beginTransaction();
        fragment2 = new TravelMessageFragment2();
        tx.replace(R.id.travelInit, fragment2);
        tx.addToBackStack(null);
        tx.commit();

这里要注意 FragmentTransaction 这个类
在用fragment替换另一个fragment时 要注意
FragmentTransaction 必须再次声明,不然会报

java.lang.IllegalStateException: commit already called

fragment 回退栈处理

fragment 需要记住2个方法
- getBackStackEntryCount
- popBackStack

一个是回退栈的个数 从1开始
另一个是模拟安卓返回键

默认返回栈定元素(peek操作)

所以后退的代码可以如下表示

public void skipBackView(View view) {
        if(is_can_back == true) {
            //finish();
            if(fragmentManager.getBackStackEntryCount() > 1) {
                fragmentManager.popBackStack();
            }else {
                finish();
            }
        }
    }

获取安卓回退事件(onKeyDown)代码如下:

@Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_BACK ) {
            if(is_can_back) {
                if(fragmentManager.getBackStackEntryCount() > 1) {
                    fragmentManager.popBackStack();
                }else {
                    finish();
                }
            }
        }
        return false;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值