Fragment中的onActivityResult不被调用,有几种情况,请大家一一排查。
1.检查该Fragment所属的Activity中,是否重写了onActivityResult方法。
如果是该种情况,请确保写了super.onActivityResult:
- @Override
- protected void onActivityResult(int requestCode, int resultCode, Intent data) {
- super.onActivityResult(requestCode, resultCode, data);
- if (resultCode == RESULT_OK) {
- //Activity中相关处理代码
- }
- }
2.检查Fragment中的startActivityForResult的调用方式。
请确保不要使用getActivity().startActivityForResult方法,而是要直接使用startActivityForResult。
3.如果以上两方面都没能解决问题,很可能是如下情况了,略有复杂:
该情况是在support library中使用了Nested Fragment,就是说在Fragment中进行了嵌套,比如用ViewPager展示Fragment等情况。这可以算Google的一个Bug,具体可参见这篇博客:
http://blog.shamanland.com/2014/01/nested-fragments-for-result.html
解决方案:
最好的方式是写一个BaseActivity继承FragmentActivity,重写onActivityResult方法,你用到的Activity都继承BaseActivity来做。BaseActivity具体实现:
- package com.jupaidaren.android;
- import java.util.List;
- import android.content.Intent;
- import android.support.v4.app.Fragment;
- import android.support.v4.app.FragmentActivity;
- import android.support.v4.app.FragmentManager;
- import android.util.Log;
- abstract public class BaseActivity extends FragmentActivity {
- private static final String TAG = "BaseActivity";
- @Override
- protected void onActivityResult(int requestCode, int resultCode, Intent data) {
- FragmentManager fm = getSupportFragmentManager();
- int index = requestCode >> 16;
- if (index != 0) {
- index--;
- if (fm.getFragments() == null || index < 0
- || index >= fm.getFragments().size()) {
- Log.w(TAG, "Activity result fragment index out of range: 0x"
- + Integer.toHexString(requestCode));
- return;
- }
- Fragment frag = fm.getFragments().get(index);
- if (frag == null) {
- Log.w(TAG, "Activity result no fragment exists for index: 0x"
- + Integer.toHexString(requestCode));
- } else {
- handleResult(frag, requestCode, resultCode, data);
- }
- return;
- }
- }
- /**
- * 递归调用,对所有子Fragement生效
- *
- * @param frag
- * @param requestCode
- * @param resultCode
- * @param data
- */
- private void handleResult(Fragment frag, int requestCode, int resultCode,
- Intent data) {
- frag.onActivityResult(requestCode & 0xffff, resultCode, data);
- List<Fragment> frags = frag.getChildFragmentManager().getFragments();
- if (frags != null) {
- for (Fragment f : frags) {
- if (f != null)
- handleResult(f, requestCode, resultCode, data);
- }
- }
- }
- }
//----------------------------------------------------------------------------------------------------------------------------------------
public class MainActivity extends FragmentActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_fragment);
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction ft = fragmentManager.beginTransaction();
ft.add(R.id.content, new FragmentTest());
ft.commit();
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
//super.onActivityResult(requestCode, resultCode, data);
if (resultCode != Activity.RESULT_OK) {
return;
}
String result = data.getStringExtra("data");
Toast.makeText(this, result+ "2222222222222222", Toast.LENGTH_SHORT).show();
}
}
public class FragmentTest extends Fragment implements OnClickListener{
private static final int REQUEST_CODE_SECOND = 0x11;
Button btn;
@Override
public View onCreateView(LayoutInflater inflater,
@Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_layout, container, false);
btn = (Button) view.findViewById(R.id.btn);
btn.setOnClickListener(this);
return view;
}
@Override
public void onClick(View v) {
Intent intent = new Intent(getActivity(), SecondActivity.class);
startActivityForResult(intent, REQUEST_CODE_SECOND);
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode != Activity.RESULT_OK) {
return;
}
if (requestCode == REQUEST_CODE_SECOND) {
String result = data.getStringExtra("data");
Toast.makeText(getActivity(), result, Toast.LENGTH_SHORT).show();
}
}
}
public class SecondActivity extends FragmentActivity implements OnClickListener{
Button btn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
btn = (Button) findViewById(R.id.btn);
btn.setOnClickListener(this);
}
@Override
public void onClick(View v) {
Intent intent = new Intent();
intent.putExtra("data", "coding");
setResult(Activity.RESULT_OK, intent);
finish();
}
}
(1)结果这里仅仅弹出了coding2222222222222222,并没有弹出coding。
需要将MainActivity中调用super.onActivityResult(requestCode, resultCode, data);。
(2)在MainActivity中调用super.onActivityResult(requestCode, resultCode, data);,
然后弹出的效果,是先弹出coding,然后在弹出coding2222222222222222。
可以推测一下执行的相关顺序。