Android巧用Fragment解耦onActivityResult详解

下面我将详细讲解“Android巧用Fragment解耦onActivityResult详解”攻略,并附上两条示例说明。

概述

在 Android 开发中,遇到需要调用其他 Activity 并返回结果的情况时,常常使用 startActivityForResult() 方法。但是,onActivityResult() 方法所处理的逻辑通常较为复杂,且需在 Activity 中直接处理。如果有多个 Activity 需要处理不同的结果,代码会变得杂乱无章。因此,需要解耦 onActivityResult() 方法的处理流程,提高代码的可维护性和可测试性。

这里介绍一种使用 Fragment 解耦 onActivityResult() 的方法。

原理

使用 Fragment 来处理 startActivityForResult() 方法返回的结果,具体原理如下:

  1. 首先,在调用 startActivityForResult() 方法前,创建一个 Fragment
  2. Fragment 中实现 onActivityResult() 方法,处理返回的结果。
  3. 在调用 startActivityForResult() 方法时,将刚刚创建的 Fragment 的实例作为参数传入。
  4. ActivityonActivityResult() 方法中在调用 FragmentonActivityResult() 方法。
  5. 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() 方法中调用 FragmentonActivityResult() 方法:

@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() 方法中同样调用 FragmentonActivityResult() 方法。

结论

使用 Fragment 解耦 onActivityResult() 的做法,能有效地减少代码混淆,更易于阅读和维护。这种方法还能促进 Activity 和 Fragment 的分离,增强代码的可测试性和可复用性。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Android巧用Fragment解耦onActivityResult详解 - Python技术站

(0)
上一篇 2023年5月16日
下一篇 2023年5月16日

相关文章

  • 简单说说iOS之WKWebView的用法小结

    下面我将详细讲解“简单说说iOS之WKWebView的用法小结”的完整攻略,包含两条示例说明。 简单说说iOS之WKWebView的用法小结 什么是WKWebView? WKWebView是在iOS 8中引入的一个新的API,它是UIWebView的替代方案,它具有卓越的性能和功能。它是WebKit框架的一部分,并且是使用Objective-C和Swift编…

    GitHub 2023年5月16日
    00
  • GitHub上77.9K的Axios项目有哪些值得借鉴的地方详析

    对于“GitHub上77.9K的Axios项目有哪些值得借鉴的地方详析”的完整攻略,我将分成以下几个部分来进行讲解: 背景介绍:介绍Axios项目的背景以及它是什么。 Axios优秀特性:介绍Axios项目的几个具有亮点的优秀特性。 借鉴经验与示例代码:给出两个具体的示例说明,并通过代码展示Axios项目的借鉴价值。 1. 背景介绍 Axios是一个基于Pr…

    GitHub 2023年5月16日
    00
  • Github代码常用指令(小结)

    Github代码常用指令(小结) 在Github上进行开发的过程中,代码常用指令是非常重要的,本文将会对Github代码常用指令进行介绍。 git clone 使用git clone可以将远程仓库克隆到本地。例如,我想将一个名为example的仓库克隆到本地的/path/to/dir目录下,可以使用以下指令。 git clone https://github…

    GitHub 2023年5月16日
    00
  • IntelliJ IDEA本地代码提交到github网站不显示与本地不同步问题的解决办法

    为了更好的理解和操作,我将整个过程拆分成以下两个步骤和示例: 步骤一:本地代码提交到GitHub网站未显示 示例 假如你已经在本地仓库中完成了代码的修改,并将代码修改提交到了本地Git仓库。但当你打开GitHub网站的仓库页面时,却没有看到你刚才所提交的代码。这时,你需要进行以下操作。 在本地仓库中使用git log命令查看自己最新提交的日志,获取最新的一次…

    GitHub 2023年5月16日
    00
  • iOS如何封装带复制功能的UILabel示例代码

    iOS如何封装带复制功能的UILabel示例代码,这个问题需要分两方面来讲解。 首先是UILabel的封装 我们首先需要创建一个继承于UILabel的子类,并重写父类的initWithFrame:方法,添加如下代码: – (instancetype)initWithFrame:(CGRect)frame { self = [super initWithFra…

    GitHub 2023年5月16日
    00
  • Google Play怎么安装?Win11安装运行Google Play商店的三种方法

    下面是详细讲解“Google Play怎么安装?Win11安装运行Google Play商店的三种方法”的完整攻略: 一、Google Play是什么 Google Play是Google公司推出的安卓应用商店,是安卓设备上下载和更新应用的主要途径。安装Google Play商店可以让你下载和使用许多在安卓设备上常用的应用,如微信、支付宝、抖音等等。 二、G…

    GitHub 2023年5月16日
    00
  • 详解Git建立本地仓库的两种方法

    下面是详解Git建立本地仓库的两种方法的完整攻略。 方法一:从本地文件夹创建新的Git仓库 步骤一:创建目录并初始化Git仓库 首先,我们需要创建一个新的目录来存储我们的项目文件。可以在命令行中输入以下命令: mkdir myproject cd myproject git init 这会在当前目录下创建一个名为“myproject”的文件夹,并初始化一个名…

    GitHub 2023年5月16日
    00
  • Vue项目打包部署到GitHub Pages的实现步骤

    下面是关于Vue项目打包部署到GitHub Pages的实现步骤的完整攻略,步骤如下: 准备工作 先在GitHub上创建一个新的仓库,用来托管我们打包后的代码 确保本地已经安装好了node.js和npm,如果没有可以上官网下载 确保本地已经安装好了Vue-cli脚手架工具 npm install -g vue-cli 构建Vue项目 使用Vue-cli构建一…

    GitHub 2023年5月16日
    00
合作推广
合作推广
分享本页
返回顶部