public class SQResult {
public static final int RESULT_OK = Activity.RESULT_OK;
public static final int RESULT_CANCEL = Activity.RESULT_CANCELED;
public int requestCode;
public int resultCode;
public Intent data;
public SQResult(int requestCode) {
this.requestCode = requestCode;
this.resultCode = RESULT_CANCEL;
}
public SQResult(int requestCode, int resultCode, Intent data) {
this.requestCode = requestCode;
this.resultCode = resultCode;
this.data = data;
}
}
返回結(jié)果rxjava發(fā)送 Fragment
public class SQFragment extends Fragment {
public PublishSubject<SQResult> subject;
public SQResult sqResult;
/**
* 啟動(dòng)Activity接收到返回值 使用rxjava發(fā)送
*/
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (subject != null) {
subject.onNext(new SQResult(requestCode, resultCode, data));
subject.onComplete();
}
}
/**
* 在Fragment onDestroy的時(shí)候檢測(cè)是否有返回值,有則使用rxjava發(fā)送。
* setFragmentResult調(diào)用,或者SQUtils.startFragmentForResult調(diào)用都會(huì)有返回值。
*/
@Override
public void onDestroy() {
if (sqResult != null && subject != null) {
subject.onNext(sqResult);
subject.onComplete();
}
super.onDestroy();
}
/**
* 設(shè)置Fragment 返回值
*/
public void setFragmentResult(int resultCode, Intent data) {
if (sqResult == null) sqResult = new SQResult(0);
sqResult.resultCode = resultCode;
sqResult.data = data;
}
}
啟動(dòng)方法
public class SQUtils {
/**
* 獲取Fragment,因?yàn)閱?dòng)Activity時(shí)候需要用這個(gè)Fragment進(jìn)行代理來(lái)啟動(dòng)Activity
*/
@NonNull
private static SQFragment getSQFragment(FragmentManager fragmentManager) {
SQFragment fragment = (SQFragment) fragmentManager.findFragmentByTag(SQFragment.class.getCanonicalName());
if (fragment == null) {
fragment = new SQFragment();
fragmentManager.beginTransaction()
.add(fragment, SQFragment.class.getCanonicalName())
.commitNow();
}
return fragment;
}
/**
* Activity啟動(dòng)Activity ForResult
*/
public static Observable<SQResult> startActivityForResult(AppCompatActivity activity, Intent intent, int requestCode) {
SQFragment sqFragment = getSQFragment(activity.getSupportFragmentManager());
sqFragment.startActivityForResult(intent, requestCode);
sqFragment.subject = PublishSubject.create();
return sqFragment.subject
.filter(sqResult -> sqResult.requestCode == requestCode)
.filter(sqResult -> sqResult.resultCode == SQResult.RESULT_OK);
}
/**
* Fragment啟動(dòng)Activity ForResult
*/
public static Observable<SQResult> startActivityForResult(Fragment fragment, Intent intent, int requestCode) {
SQFragment sqFragment = getSQFragment(fragment.getChildFragmentManager());
sqFragment.startActivityForResult(intent, requestCode);
sqFragment.subject = PublishSubject.create();
return sqFragment.subject
.filter(sqResult -> sqResult.requestCode == requestCode)
.filter(sqResult -> sqResult.resultCode == SQResult.RESULT_OK);
}
/**
* Activity啟動(dòng)Fragment ForResult
* <p>
* Activity中必須包含被替換的View id
*
* @param containID 被替換的View id
*/
public static Observable<SQResult> startFragmentForResult(AppCompatActivity activity, int containID, SQFragment fragment, int requestCode) {
if (activity.findViewById(containID) == null) {
throw new IllegalArgumentException("activity中不存在containID");
}
activity.getSupportFragmentManager()
.beginTransaction()
.replace(containID, fragment)
.addToBackStack(fragment.getClass().getCanonicalName())
.commit();
fragment.sqResult = new SQResult(requestCode);
fragment.subject = PublishSubject.create();
return fragment.subject
.filter(sqResult -> sqResult.requestCode == requestCode)
.filter(sqResult -> sqResult.resultCode == SQResult.RESULT_OK);
}
/**
* Fragment啟動(dòng)Fragment ForResult
* <p>
* 被啟動(dòng)的Fragment必須是SQFragment的子類
* <p>
* Fragment中必須包含被替換的View id
*
* @param containID 被替換的View id
*/
public static Observable<SQResult> startFragmentForResult(Fragment fromFragment, int containID, SQFragment toFragment, int requestCode) {
if (fromFragment.getView().findViewById(containID) == null) {
throw new IllegalArgumentException("fragment中不存在containID");
}
fromFragment.getChildFragmentManager()
.beginTransaction()
.replace(containID, toFragment)
.addToBackStack(toFragment.getClass().getCanonicalName())
.commit();
toFragment.sqResult = new SQResult(requestCode);
toFragment.subject = PublishSubject.create();
return toFragment.subject
.filter(sqResult -> sqResult.requestCode == requestCode)
.filter(sqResult -> sqResult.resultCode == SQResult.RESULT_OK);
}
}