Android巧用Fragment解耦onActivityResult详解

前言

最近在研究jsbridge, 一直在想怎么样才能让需要startActivityForResult比如打开相机拍照这样的操作在webView中能更简单一点, 直到我发现了这篇文章

两个类,让你再也不用实现onActivityResult()

看了之后, 马上模仿了文中的代码实现了一下.

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:

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:

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 + ", resultCode = " + resultCode,
      Toast.LENGTH_SHORT).show();
   }
  });
 }
}

SecondActivity

public class SecondActivity extends AppCompatActivity {
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_second);

 }

 public void returnResult(View view) {
  Intent intent = new Intent();
  intent.putExtra("name", "mundane");
  setResult(RESULT_OK, intent);
  finish();
 }
}

按照这样的思路, 如果需要简化jsbridge中startActivityForResult的操作, 我们只需要把Fragment和WebView绑定在一起.比如给这个Fragment取名叫WebViewFragment, 它的布局中只有一个我们封装好的WebView, 这个WebView需要监听jsbridge的所有事件我们都在fragment中写好, 包括onActivityResult中的事件, 当然也可以在这个fragment中用一个专门的管理类来管理注册的事件.以后Activity中有用到WebView的地方我们就直接用这个WebViewFragment就好了.也就是说, 把这个WebViewFragment, 当成我们之前的WebView.

github地址:

EasyOnActivityResult

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对我们的支持。

(0)

相关推荐

  • 快速解决fragment中onActivityResult不调用的问题

    fragment 通过startActivityForResult方法启动另一个activity,返回时,不调用onActivityResult方法, 解决步骤: 1.  在Fragment所属的Activity中,重写了onActivityResult方法,确保加上super.onActivityResult @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { sup

  • Android onActivityResult和setResult方法详解及使用

    Android onActivityResult和setResult方法 最近做公司项目遇到Android onActivityResult和setResult ,在应用过程中进程报错,这里有必要记录下,以免再次使用出错. 如果你想在Activity中得到新打开Activity关闭后返回的数据,你需要使用系统提供的startActivityForResult(Intent intent,int requestCode)方法打开新的Activity,新的Activity关闭后会向前面的Activi

  • Android中Fragment多层嵌套时onActivityResult无法正确回调问题的解决方法

    前言: Fragment也可以使用startActivityForResult方法去打开一个Activity,然后在其onActivityResult方法中处理结果,可是当Fragment嵌套的时候,由于FragmentActivity的BUG导致只会回调最外那层Fragment的onActivityResult方法,于是乎当前Fragment就收不到结果了. BUG分析: 解决这个问题之前我们先通过源码分析一下是什么原因导致的,以22.2.1版本的support-v4库为例 我们先从Fragm

  • Android中两个类让你再也不用实现onActivityResult()

    前言 当我们知道fragment仅仅可以收到自己请求的回调后,我们就可以用它来解耦activity中onActivityResult的逻辑了.一般情况下,如果一个activity中多个回调结果的话,onActivityResult()中会有各种case判断,并且这种设计也打断了流式写法.那么我们索性建立一个无UI的fragment做精准的接收器,这样就可以再也不写onActivityResult()了. Fragment: /** * @author Kale * @date 2018/4/13

  • Android巧用Fragment解耦onActivityResult详解

    前言 最近在研究jsbridge, 一直在想怎么样才能让需要startActivityForResult比如打开相机拍照这样的操作在webView中能更简单一点, 直到我发现了这篇文章 两个类,让你再也不用实现onActivityResult() 看了之后, 马上模仿了文中的代码实现了一下. Fragment: public class OnActResultEventDispatcherFragment extends Fragment{ public static final String

  • Android中mvp模式使用实例详解

    MVP 是从经典的模式MVC演变而来,它们的基本思想有相通的地方:Controller/Presenter负责逻辑的处理,Model提供数据,View负 责显示.作为一种新的模式,MVP与MVC有着一个重大的区别:在MVP中View并不直接使用Model,它们之间的通信是通过Presenter (MVC中的Controller)来进行的,所有的交互都发生在Presenter内部,而在MVC中View会从直接Model中读取数据而不是通过 Controller. 在MVC里,View是可以直接访问

  • Android mvvm之LiveData原理案例详解

    1. 生命周期感知 1.1 生命周期感知组件 我们知道,Controller(Activity or Fragment) 都是有生命周期的,但是传统的 Controller 实现方式只负责 Controller 本身的生命周期管理,而与业务层的数据之间并没有实现良好解耦的生命周期事件交换.所以业务层都需要自己主动去感知 Controller 生命周期的变化,并在 Controller 的生存期处理数据的保活,而在消亡时刻解除与 Controller 之间的关系,这种处理方式随着业务规模的扩大往往

  • ​​​​​​​Android H5通用容器架构设计详解

    目录 背景 术语对齐 探索 如何优雅地提供接口调用? 怎样封装多个不同类型的H5容器容器? 整体架构 通用容器 框架容器 基础组件 这样的架构能带来什么样的好处? 背景 大家如果经历过Hybrid项目的开发,即项目中涉及到H5与Native之间的交互,那么很有可能会遇到各种各样的H5容器.为什么会有那么多各种各样的容器呢...这也是轮子多的通病了,轮子多到业务方不知道选哪个.当然,也有可能大家压根就不会使用到H5容器,直接用系统WebView就完事儿了,比如我的前东家就是这样做的.那这篇文章的主

  • Android startActivityForResult的调用与封装详解

    目录 前言 一.原生的使用 二.对原生的封装Ghost 三.Result Api 的使用 四.Result Api 的封装 4.1 封装简化创建方式 4.2 自动注册/按需注册 总结 前言 startActivityForResult 可以说是我们常用的一种操作了,用于启动新页面并拿到这个页面返回的数据,是两个 Activity 交互的基本操作. 虽然可以通过接口,消息总线,单例池,ViewModel 等多种方法来间接的实现这样一个功能,但是 startActivityForResult 还是使

  • Android中XUtils3框架使用方法详解(一)

    xUtils简介 xUtils 包含了很多实用的android工具. xUtils 支持大文件上传,更全面的http请求协议支持(10种谓词),拥有更加灵活的ORM,更多的事件注解支持且不受混淆影响... xUitls 最低兼容android 2.2 (api level 8) 今天给大家带来XUtils3的基本介绍,本文章的案例都是基于XUtils3的API语法进行的演示.相信大家对这个框架也都了解过, 下面简单介绍下XUtils3的一些基本知识. XUtils3一共有4大功能:注解模块,网络

  • Android实现屏幕锁定源码详解

    最近有朋友问屏幕锁定的问题,自己也在学习,网上找了下也没太详细的例子,看的资料书上也没有有关屏幕锁定程序的介绍,下个小决心,自己照着官方文档学习下,现在做好了,废话不多说,先发下截图,看下效果,需要注意的地方会加注释,有问题的朋友可以直接留言,我们共同学习交流,共同提高进步!直接看效果图: 一:未设置密码时进入系统设置的效果图如下: 二:设置密码方式预览: 三:密码解密效果图 四:九宫格解密时的效果图 下面来简单的看下源码吧,此处讲下,这个小DEMO也是临时学习下的,有讲的不明白的地方请朋友直接

  • android之SeekBar控件用法详解

    MainActivity.java package com.example.mars_2400_seekbar; import android.support.v7.app.ActionBarActivity; import android.support.v7.app.ActionBar; import android.support.v4.app.Fragment; import android.app.Activity; import android.os.Bundle; import a

  • android之RatingBar控件用法详解

    MainActivity.java package com.example.mars_2500_ratingbar; import android.support.v7.app.ActionBarActivity; import android.support.v7.app.ActionBar; import android.support.v4.app.Fragment; import android.app.Activity; import android.os.Bundle; import

  • AndroidX下使用Activity和Fragment的变化详解

    过去的一段时间,AndroidX 软件包下的 Activity/Fragmet 的 API 发生了很多变化.让我们看看它们是如何提升Android 的开发效率以及如何适应当下流行的编程规则和模式. 本文中描述的所有功能现在都可以在稳定的 AndroidX 软件包中使用,它们在去年均已发布或移至稳定版本. 在构造器中传入布局 ID 从 AndroidX  AppCompat 1.1.0 和 Fragment 1.1.0 ( 译者注:AppCompat 包含 Fragment,且 Fragment

随机推荐