下面我将详细讲解“Android巧用Fragment解耦onActivityResult详解”攻略,并附上两条示例说明。
概述
在 Android 开发中,遇到需要调用其他 Activity 并返回结果的情况时,常常使用 startActivityForResult()
方法。但是,onActivityResult()
方法所处理的逻辑通常较为复杂,且需在 Activity 中直接处理。如果有多个 Activity 需要处理不同的结果,代码会变得杂乱无章。因此,需要解耦 onActivityResult()
方法的处理流程,提高代码的可维护性和可测试性。
这里介绍一种使用 Fragment 解耦 onActivityResult()
的方法。
原理
使用 Fragment 来处理 startActivityForResult()
方法返回的结果,具体原理如下:
- 首先,在调用
startActivityForResult()
方法前,创建一个Fragment
。 - 在
Fragment
中实现onActivityResult()
方法,处理返回的结果。 - 在调用
startActivityForResult()
方法时,将刚刚创建的Fragment
的实例作为参数传入。 - 在
Activity
的onActivityResult()
方法中在调用Fragment
的onActivityResult()
方法。 - 在
Fragment
中处理返回的结果,即可实现解耦。
示例说明
下面,我们将通过两个具体的示例来讲解这种方法。
示例一
在这个示例中,我们的需求是,在点击按钮后启动一个新的 Activity,并从这个 Activity 中返回一个字符串,并将返回的字符串显示在一个 TextView 中。
首先,在我们的 Activity 中创建一个 Fragment
,用于处理返回的结果:
public class MyFragment extends Fragment {
private static final int REQUEST_CODE = 100;
private TextView mTextView;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_my, container, false);
mTextView = (TextView) view.findViewById(R.id.text_view);
view.findViewById(R.id.btn).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(getActivity(), MyActivity.class);
startActivityForResult(intent, REQUEST_CODE);
}
});
return view;
}
@Override
public void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
if (requestCode == REQUEST_CODE && resultCode == Activity.RESULT_OK) {
String result = data.getStringExtra("result");
mTextView.setText(result);
}
}
}
然后,我们在 Activity 的布局文件中,添加一个 FrameLayout,用于显示 Fragment
:
<FrameLayout
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent" />
接下来,在 Activity 的 onCreate()
方法中,动态添加 Fragment
:
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
MyFragment fragment = new MyFragment();
ft.add(R.id.container, fragment);
ft.commit();
最后,在 Activity 的 onActivityResult()
方法中调用 Fragment
的 onActivityResult()
方法:
@Override
public void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
Fragment fragment = getSupportFragmentManager().findFragmentById(R.id.container);
if (fragment != null) {
fragment.onActivityResult(requestCode, resultCode, data);
}
}
示例二
在这个示例中,我们的需求是,在点击按钮后启动一个新的 Activity,并从这个 Activity 中返回一个图片,并将返回的图片显示在一个 ImageView 中。
和示例一类似,我们同样需要在 Activity 中创建一个 Fragment
,用于处理返回的结果:
public class MyFragment extends Fragment {
private static final int REQUEST_CODE = 100;
private ImageView mImageView;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_my, container, false);
mImageView = (ImageView) view.findViewById(R.id.image_view);
view.findViewById(R.id.btn).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(getActivity(), MyActivity.class);
startActivityForResult(intent, REQUEST_CODE);
}
});
return view;
}
@Override
public void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
if (requestCode == REQUEST_CODE && resultCode == Activity.RESULT_OK) {
Uri uri = data.getData();
mImageView.setImageURI(uri);
}
}
}
然后,在 Activity 的布局文件中,同样添加一个 FrameLayout,用于显示 Fragment
:
<FrameLayout
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent" />
接下来,在 Activity 的 onCreate()
方法中动态添加 Fragment
:
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
MyFragment fragment = new MyFragment();
ft.add(R.id.container, fragment);
ft.commit();
最后,在 Activity 的 onActivityResult()
方法中同样调用 Fragment
的 onActivityResult()
方法。
结论
使用 Fragment
解耦 onActivityResult()
的做法,能有效地减少代码混淆,更易于阅读和维护。这种方法还能促进 Activity 和 Fragment 的分离,增强代码的可测试性和可复用性。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Android巧用Fragment解耦onActivityResult详解 - Python技术站