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并获取结果的地方都需要编写类似的代码,增加了代码冗余。
三、解决方案
为了解决上述问题,我们可以创建一个名为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并获取结果的过程。
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(); } }); } }
五、归纳
通过使用OnActResultEventDispatcherFragment
和ActResultRequest
两个类,我们可以有效地解耦onActivityResult()
方法,使得在jsbridge中启动Activity并获取结果变得更加简单,这种方法不仅提高了代码的可维护性,还减少了代码冗余,是一种值得推荐的优化方案。
小伙伴们,上文介绍了“Android巧用Fragment解耦onActivityResult详解”的内容,你了解清楚吗?希望对你有所帮助,任何问题可以给我留言,让我们下期再见吧。
原创文章,作者:未希,如若转载,请注明出处:https://www.kdun.com/ask/1293827.html
本网站发布或转载的文章及图片均来自网络,其原创性以及文中表达的观点和判断不代表本网站。如有问题,请联系客服处理。
发表回复