如何在Android中巧用Fragment解耦onActivityResult?

Android巧用Fragment解耦onActivityResult,通过创建OnActResultEventDispatcherFragment和ActResultRequest类,简化处理onActivityResult的方法,提高代码的可维护性。

Android巧用Fragment解耦onActivityResult详解

Android巧用Fragment解耦onActivityResult详解

一、背景介绍

在Android开发中,onActivityResult()方法用于处理从子Activity返回的结果,当涉及到多个Fragment交互时,尤其是需要处理startActivityForResult()的回调,onActivityResult()往往会变得复杂且难以维护,为了解决这个问题,我们可以使用Fragment来解耦onActivityResult()方法,提高代码的可维护性。

二、问题分析

在一个Activity中包含多个Fragment时,如果某个Fragment跳转到另一个Activity并希望获取结果,直接使用onActivityResult()可能会遇到以下问题:

1、回调逻辑复杂:每个Fragment都需要重写onActivityResult()方法,导致回调逻辑分散且难以管理。

2、嵌套Fragment问题:在多层嵌套的Fragment结构中,只有最外层的Fragment能够接收到回调,内嵌的Fragment无法直接接收结果。

3、代码冗余:每个需要启动Activity并获取结果的地方都需要编写类似的代码,增加了代码冗余。

Android巧用Fragment解耦onActivityResult详解

三、解决方案

为了解决上述问题,我们可以创建一个名为OnActResultEventDispatcherFragment的Fragment和一个名为ActResultRequest的工具类,通过这两个类来简化onActivityResult()的使用。

四、实现步骤

1. 创建OnActResultEventDispatcherFragment

我们需要创建一个继承自Fragment的类OnActResultEventDispatcherFragment,该类将负责统一管理所有的onActivityResult()回调。

public class OnActResultEventDispatcherFragment extends Fragment {
    public static final String TAG = "on_act_result_event_dispatcher";
    private int mRequestCode = 0x11;
    private SparseArray<ActResultRequest.Callback> mCallbacks = new SparseArray<>();
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setRetainInstance(true); // 确保Fragment在配置更改后仍然存在
    }
    public void startForResult(Intent intent, ActResultRequest.Callback callback) {
        // 将callback与requestCode关联
        mCallbacks.put(mRequestCode, callback);
        startActivityForResult(intent, mRequestCode);
        mRequestCode++;
    }
    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        // 根据requestCode找到对应的callback并执行
        ActResultRequest.Callback callback = mCallbacks.get(requestCode);
        mCallbacks.remove(requestCode);
        if (callback != null) {
            callback.onActivityResult(resultCode, data);
        }
    }
}

2. 创建ActResultRequest工具类

我们创建一个工具类ActResultRequest,用于简化启动Activity并获取结果的过程。

Android巧用Fragment解耦onActivityResult详解
public class ActResultRequest {
    private OnActResultEventDispatcherFragment fragment;
    public ActResultRequest(FragmentActivity activity) {
        fragment = getEventDispatchFragment(activity);
    }
    private OnActResultEventDispatcherFragment getEventDispatchFragment(FragmentActivity activity) {
        FragmentManager fragmentManager = activity.getSupportFragmentManager();
        OnActResultEventDispatcherFragment fragment = findEventDispatchFragment(fragmentManager);
        if (fragment == null) {
            fragment = new OnActResultEventDispatcherFragment();
            fragmentManager.beginTransaction()
                    .add(fragment, OnActResultEventDispatcherFragment.TAG)
                    .commitAllowingStateLoss();
            fragmentManager.executePendingTransactions();
        }
        return fragment;
    }
    private OnActResultEventDispatcherFragment findEventDispatchFragment(FragmentManager manager) {
        return (OnActResultEventDispatcherFragment) manager.findFragmentByTag(OnActResultEventDispatcherFragment.TAG);
    }
    public void startForResult(Intent intent, Callback callback) {
        fragment.startForResult(intent, callback);
    }
    public interface Callback {
        void onActivityResult(int resultCode, Intent data);
    }
}

3. 使用ActResultRequest启动Activity并获取结果

在需要启动Activity并获取结果的地方,我们可以通过ActResultRequest来简化操作。

public class MainActivity extends AppCompatActivity {
    private static final String TAG = "MainActivity";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
    public void start(View view) {
        Intent intent = new Intent(this, SecondActivity.class);
        ActResultRequest request = new ActResultRequest(this);
        request.startForResult(intent, new ActResultRequest.Callback() {
            @Override
            public void onActivityResult(int resultCode, Intent data) {
                Log.d(TAG, "resultCode = " + resultCode);
                String name = data.getStringExtra("name");
                Log.d(TAG, "name = " + name);
                Toast.makeText(MainActivity.this, "name: " + name, Toast.LENGTH_SHORT).show();
            }
        });
    }
}

五、归纳

通过使用OnActResultEventDispatcherFragmentActResultRequest两个类,我们可以有效地解耦onActivityResult()方法,使得在jsbridge中启动Activity并获取结果变得更加简单,这种方法不仅提高了代码的可维护性,还减少了代码冗余,是一种值得推荐的优化方案。

小伙伴们,上文介绍了“Android巧用Fragment解耦onActivityResult详解”的内容,你了解清楚吗?希望对你有所帮助,任何问题可以给我留言,让我们下期再见吧。

原创文章,作者:未希,如若转载,请注明出处:https://www.kdun.com/ask/1293827.html

本网站发布或转载的文章及图片均来自网络,其原创性以及文中表达的观点和判断不代表本网站。如有问题,请联系客服处理。

(0)
未希新媒体运营
上一篇 2024-11-12 03:36
下一篇 2024-11-12 03:37

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

产品购买 QQ咨询 微信咨询 SEO优化
分享本页
返回顶部
云产品限时秒杀。精选云产品高防服务器,20M大带宽限量抢购 >>点击进入