Activity Fragment流式寫法思路

使用方式

        //啟動(dòng)Activity
        SQUtils.startActivityForResult(this, new Intent(this, SQLoginActivity.class), 1000)
                .subscribe(sqResult -> Log.i(TAG, "onCreate: requestCode=" + sqResult.requestCode
                        + " resultCode=" + sqResult.resultCode
                        + " msg=" + sqResult.data.getStringExtra("msg")));

        //啟動(dòng)Fragment
        SQUtils.startFragmentForResult(this, R.id.fl_sq_container, new SQLoginFragment(), 1001)
                .subscribe(sqResult -> Log.i(TAG, "onCreate: requestCode=" + sqResult.requestCode
                        + " resultCode=" + sqResult.resultCode
                        + " msg=" + sqResult.data.getStringExtra("msg")));

返回結(jié)果封裝

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

}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,825評(píng)論 25 709

友情鏈接更多精彩內(nèi)容