当前位置:首页 > 行业动态 > 正文

如何在Android中巧妙利用Fragment来解耦onActivityResult方法?

Android开发中,通过创建 OnActResultEventDispatcherFragmentActResultRequest两个类,可以简化 onActivityResult的回调处理,实现Fragment与Activity之间的解耦。

Android巧用Fragment解耦onActivityResult

如何在Android中巧妙利用Fragment来解耦onActivityResult方法?  第1张

背景介绍

在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() 方法,而是将所有的回调逻辑集中在一个地方管理,大大提高了代码的可维护性。

通过使用OnActResultEventDispatcherFragmentActResultRequest 两个类,我们可以有效地解耦onActivityResult(),简化多层嵌套Fragment中的回调逻辑,这种方法不仅提高了代码的可读性和可维护性,还使得在复杂的项目中更容易追踪和管理回调逻辑。

以上就是关于“Android巧用Fragment解耦onActivityResult”的问题,朋友们可以点击主页了解更多内容,希望可以够帮助大家!

0