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