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

2,895 阅读1分钟

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

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

思路来自于:RxPermissionsFragment 代码库在: github.com/hss01248/St…

基类

public BaseTransFragment(FragmentActivity activity, Bean bean) {
        this.activity = activity;
        this.bean = bean;
        startFragmentTransaction();
    }


    private void startFragmentTransaction() {
        try {
            FragmentManager fragmentManager = activity.getSupportFragmentManager();
                fragmentManager.beginTransaction()
                        .add(this, UUID.randomUUID().toString())
                        .commitNowAllowingStateLoss();
        } catch (Throwable e) {
            e.printStackTrace();
        }
    }

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setRetainInstance(true);
        if(debugable){
            Log.d("frag","onCreate:"+this);
        }
    }
    
     public void finish(){
        try {
            getActivity().getSupportFragmentManager().beginTransaction().remove(this).commitAllowingStateLoss();
        }catch (Throwable throwable){
            throwable.printStackTrace();
        }
    }

例子:

onactivityResult的处理:

class InAppResultFragment extends BaseTransFragment<Intent> {
    public InAppResultFragment(FragmentActivity activity, Intent intent) {
        super(activity, intent);
    }
    TheActivityListener listener;
    public void startActivityForResult(TheActivityListener listener){
        try {
            this.listener = listener;
            startActivityForResult(bean,new Random().nextInt(589));
        }catch (Throwable e){
            listener.onActivityNotFound(e);
            if(StartActivityUtil.debugable){
                e.printStackTrace();
            }
        }
    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (StartActivityUtil.debugable) {
            Log.i("onActivityResult", "req:" + requestCode + ",result:" + resultCode + ",data:" + data);
        }
        listener.onActivityResult(requestCode,resultCode,data);
        finish();

    }
}

使用:
  new InAppResultFragment(activity,intent).startActivityForResult(listener);

此处提供一个启动activity获取result的工具类:

启动app内部页面,可以拿到onActivityCreated和onActivityResult回调 其中,onActivityCreated是通过application上注册生命周期实现

StartActivityUtil.startActivity(this, ActivityDemo2.class, null,true,
        new TheActivityListener<ActivityDemo2>() {
            @Override
            public void onActivityCreated(@NonNull ActivityDemo2 activity, @Nullable Bundle savedInstanceState) {
            //这里设置数据,然后在具体activityOnCreate()方法的super.onCreate()之后直接拿数据
                activity.setData(666);
                Toast.makeText(activity, "activity oncreate 回调", Toast.LENGTH_LONG).show();
            }

            @Override
            protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
                super.onActivityResult(requestCode, resultCode, data);
                Toast.makeText(MainActivity.this, "activity onActivityResult 回调", Toast.LENGTH_LONG).show();
            }
        });

启动第三方app,在回来时接收/检测结果:

StartActivityUtil.goOutAppForResult(this, intent, new OutActivityResultListener() {


    @Override
    public void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        boolean hasPermission =   NotificationManagerCompat.from(MainActivity.this).areNotificationsEnabled();
        Toast.makeText(MainActivity.this,"通知栏权限:"+hasPermission,Toast.LENGTH_SHORT).show();
    }

    @Override
    public void onActivityNotFound(Throwable e) {

    }
});

例子2. 拍照/图片选择-裁剪-压缩整个流程,封装成一个工具方法:


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