Fragment与Activity之间的数据交互

  1. Fragment可调用getActivity()方法获取它所在的Activity
  2. Activity可调用FragmentManager的FindFragmentById()或FindFragmentByTag()方法获取Fragment
  3. Activity——>Fragment:在Activity中创建Bundle数据包,并调用Fragment的setArguments(Bundle bundle)方法传,Fragment用getArgument收;
  4. Fragment——>Activity:需要在Fragment中定义一个内部回调的接口,再让包含Fragment的Activity实现改回调接口。这样Fragment可调用改回调方法将数据传递给Activity
  5. Activity——>Fragment的实现:
    1. Activity 代码:
      String text = editText.getText().toString();
      bundle.putString("msg"text);
      fragment.setArguments(bundle);
      fragmentTransaction.replace(R.id.frame_llfragment);
      fragmentTransaction.addToBackStack(null);
      fragmentTransaction.commit();
    2. Fragment代码:
      String text = getArguments().get("msg") + "";
      textView.setText(text);
    3. 问题:
      1. 你如果没有打字就直接进入这个Fragment中,会显示空指针异常,原因:
        1. 因为你没有数据传过来,而这Fragment中又想接收这个数据,所以会报异常;
        2. 解决办法:
          1. if (!(getArguments()==null)){
                String text = getArguments().get("msg") + "";
                textView.setText(text);
            }
          2. 添加一个判断就好了,只有在getArguments不为空的时候才接收。就好了
      2. Fragment already active,也就是Fragment已存在异常,
        1. 我查了很多资料,发现大部分是说用setter或者getter进行数据获取就可以了。后来,结合自己的知识,想出一个另类的解决办法;
        2. 原因:你在Activity中开始传数据的时候,会用到setArguments,他的内部方法是这样的:
          public void setArguments(Bundle args) {
              if (mIndex >= 0) {
                  throw new IllegalStateException("Fragment already active");
              }
              mArguments = args;
          }
        3. 然后我就在自己代码中加了一句话:
          1. if (fragment == null) {
                fragment new MyFragment();
            else {
                fragmentTransaction.remove(fragment);

                fragment new MyFragment();
            }
          2. 在commit之前先进行判断,如果,已经存在了,那么就把他移除再新建,如果没有存在,就直接新建,这样就可以解决这个异常了;
  6. Fragment向Activity传递数据:
    1. Fragment代码:
      1. public interface ResultMsg{
            public void sendMsg(String text);
        }
        private ResultMsg resultMsg =new ResultMsg() {
            @Override
            public void sendMsg(String text) {

            }
        };
      2. @Override
        public void onAttach(Activity context) {
            getActivity();
            resultMsg= (ResultMsg)context;
            super.onAttach(context);
        }
      3. resultMsg.sendMsg(textView.getText() + "");
    2. Activity代码:
      1. 继承Fragment上面的回调接口,然后,实现接口方法;
      2. public void sendMsg(String text) {
            editText.setText(text);
        }
      3. 数据就传送过来了。
      4. 解释:
        1. 首先你定义一个接口,然后在定义一个该接口的变量,接着在需要的时候,调用这个接口的变量,传进去要传递的数值。最后,完善Fragment的onAttach方法,
        2. 因为,Fragment的onAttach方法,已经废弃(还能使用,但是不被推荐,但是在V4包中,可以用Context)。
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值