OnActResultEventDispatcherFragment
和ActResultRequest
两个类,可以简化onActivityResult
的回调处理,实现Fragment与Activity之间的解耦。Android巧用Fragment解耦onActivityResult
背景介绍
在Android开发中,onActivityResult()
是一个关键的方法,用于处理从子 Activity 返回的结果,当涉及到多个Fragment交互时,尤其是需要处理startActivityForResult()
的回调,onActivityResult()
往往会变得复杂且难以维护,通过使用Fragment来解耦onActivityResult()
,可以大大简化代码结构,提高可维护性。
本文将详细介绍如何使用Fragment来解耦onActivityResult()
,避免在多层嵌套的Fragment中出现回调混乱的问题,我们将通过以下步骤进行讲解:
创建一个名为OnActResultEventDispatcherFragment
的Fragment,用于集中管理回调。
创建一个名为ActResultRequest
的类,用于简化启动Activity并获取结果的过程。
示例代码展示如何在MainActivity中使用这两个类。
创建 OnActResultEventDispatcherFragment
我们需要创建一个名为OnActResultEventDispatcherFragment
的Fragment,该Fragment将负责集中管理所有的回调逻辑。
public class OnActResultEventDispatcherFragment extends Fragment { public static final String TAG = "on_act_result_event_dispatcher"; public int mRequestCode = 0x11; private SparseArray<ActResultRequest.Callback> mCallbacks = new SparseArray<>(); @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setRetainInstance(true); } public void startForResult(Intent intent, ActResultRequest.Callback callback) { // mRequestCode与callback需要一一对应 mCallbacks.put(mRequestCode, callback); startActivityForResult(intent, mRequestCode); mRequestCode++; } @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); ActResultRequest.Callback callback = mCallbacks.get(requestCode); mCallbacks.remove(requestCode); if (callback != null) { callback.onActivityResult(resultCode, data); } } }
创建 ActResultRequest 类
我们创建一个名为ActResultRequest
的类,该类的作用是获取或创建OnActResultEventDispatcherFragment
,并提供一个简化的方法来启动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); } }
示例代码展示
我们在MainActivity
中使用这两个类来启动一个Activity并获取结果,以下是一个完整的示例:
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(); } }); } }
在这个示例中,我们通过ActResultRequest
类来启动SecondActivity
,并在回调中获取返回的数据,这样,我们就不需要在每个Fragment中重写onActivityResult()
方法,而是将所有的回调逻辑集中在一个地方管理,大大提高了代码的可维护性。
通过使用OnActResultEventDispatcherFragment
和ActResultRequest
两个类,我们可以有效地解耦onActivityResult()
,简化多层嵌套Fragment中的回调逻辑,这种方法不仅提高了代码的可读性和可维护性,还使得在复杂的项目中更容易追踪和管理回调逻辑。
以上就是关于“Android巧用Fragment解耦onActivityResult”的问题,朋友们可以点击主页了解更多内容,希望可以够帮助大家!
原创文章,作者:未希,如若转载,请注明出处:https://www.kdun.com/ask/1293705.html
本网站发布或转载的文章及图片均来自网络,其原创性以及文中表达的观点和判断不代表本网站。如有问题,请联系客服处理。
发表回复