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); }