基于透明fragment的长流程封装技巧

本文介绍了一种利用透明Fragment简化onActivityResult处理的方法,通过创建BaseTransFragment基类和工具方法,实现了无需直接在Activity中处理回调,有效避免了旋转屏幕时的Fragment重建问题。

是否厌烦了写各种onActivityResult?不要急,透明fragment来帮你

虽然fragment坑死人不偿命,但是不写view,只作为辅助功能来使用,还是很好用的.

思路来自于:RxPermissionsFragment

基类

public abstract class BaseTransFragment extends Fragment {

    protected FragmentActivity activity;//自行保存activity引导,绝对不用getActivity()这个坑货

    protected void setHostActivity(FragmentActivity activity) {
        this.activity = activity;
    }

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setRetainInstance(true);//避免旋转时fragment销毁重建
    }
}
复制代码

工具方法:

public static <T extends BaseTransFragment> T getTransFragment(FragmentActivity fragmentActivity,
            String fragmentTag, Callable<T> newIntance) {
        try {
            FragmentManager fragmentManager = fragmentActivity.getSupportFragmentManager();
            T fragment = findFragment(fragmentManager, fragmentTag);
            boolean isNewInstance = fragment == null;
            if (isNewInstance) {
                fragment = newIntance.call();
                fragmentManager.beginTransaction()
                        .add(fragment, fragmentTag)
                        .commitAllowingStateLoss();//避免数据保存和恢复导致的crash
                fragmentManager.executePendingTransactions();
            }
            fragment.setHostActivity(fragmentActivity);
            return fragment;
        } catch (Exception e) {
            e.printStackTrace();
            try {
                return newIntance.call();
            } catch (Exception e1) {
                e1.printStackTrace();
                return null;
            }
        }

    }

    private static <T extends BaseTransFragment> T findFragment(FragmentManager fragmentManager, String fragmentTag) {
        Fragment fragment = fragmentManager.findFragmentByTag(fragmentTag);
        if (fragment == null) {
            return null;
        }
        return (T) fragment;
    }
复制代码

例子:

1.写了一个VendorPayTransFragment继承basefragment,没有界面,里面封装好了整套流程,处理了各种onactivityresult,权限,网络请求等等,然后,提供一个静态方法,提供输入和回调:

public static void startOrder(FragmentActivity activity, BaseQRPayCalInfo info, IVendorPayCallback callback) {
        VendorPayTransFragment fragment = getTransFragment(activity, "offlineorder",
                new Callable<VendorPayTransFragment>() {
            @Override
            public VendorPayTransFragment call() throws Exception {
                return VendorPayTransFragment.newInstance(info);
            }
        });
        fragment.setCallback(callback);
        fragment.startScanOrder();
    }
复制代码
  1. 拍照/图片选择-裁剪-压缩整个流程,封装成一个工具方法:

TakePhotoUtil.startPickOne(this, false, new TakeOnePhotoListener() {
            @Override
            public void onSuccess(String s) {
               showImg(filePath);
            }

            @Override
            public void onFail(String path, String msg) {
                MyToast.errorBigL(s1);
            }

            @Override
            public void onCancel() {
            }
        });
复制代码
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值