Fragment返回Fragment传值

FragmentA 启动FragmentB ,然后FragmentB做完事情,返回结果给FragmentA

事例呆木如下:

先在FragmentA中启动目标FragmentB

FragmentA fromFragment=new FragmentA();
FragmentB toFragment=new FragmentB();
//注意下面这一句,必须要指定目标Fragment
toFragment.setTargetFragment(fromFragment,100);

//隐藏FragmentA显示FragmentB
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction transaction = fragmentManager.beginTransaction().setTransition(android.R.animator.fade_in);
transaction.hide(fromFragment)
           .add(R.id.switch_frameLayout, toFragment)
           .addToBackStack(null)
           .commit();

 

在目标FragmentB中处理业务

    //自己写个方法,开始返回       
    private void onTakePhotoResult() {
        sendResult(Activity.RESULT_OK);
        getFragmentManager().popBackStack();//从任务栈中弹出

    }

    private void sendResult(int resultOK) {
        if (getTargetFragment() == null) {
            return;
        } else {
            //把需要返回的数据存放到Intent中
            Intent i = new Intent();
            i.putExtra("photoPath", tempPhotoPath);
            getTargetFragment().onActivityResult(getTargetRequestCode(), resultOK, i);
        }
    }

FragmentA中重写onActivityResult()方法接收返回的结果数据

 

 @Override
 public void onActivityResult(int requestCode, int resultCode, Intent data) {
     super.onActivityResult(requestCode, resultCode, data);
     if (resultCode == Activity.RESULT_OK) {
         //开始接收返回的数据
         String photoPath = data.getStringExtra("photoPath");
     }
 }

 

这个可能会遇到一个问题:result回来的结果fragment有可能没收到,这个是因为activity拦截了返回结果。

由于fragment是寄存在activity中的,那么在fragment返回给fragment值的时候就有可能出现被拦截的情况。这个我也是调试了很久才发现被拦截的。

解决方法也非常简单,就是在activity的onActivityResult()方法中转发一下结果数据给对应的fragment就好了。具体实现代码如下:

重写activity的onActivityResult()方法。

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
   super.onActivityResult(requestCode, resultCode, data);
   //转发返回的结果给fragment
   fragment.onActivityResult(requestCode,resultCode,data);
}

 

posted @ 2017-06-08 14:43  客舍青  阅读(2718)  评论(0编辑  收藏  举报