栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 移动开发 > Android

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

Android 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

前言

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

Fragment:


public class onActResultEventDispatcherFragment extends Fragment {

 public static final String TAG = "on_act_result_event_dispatcher";

 private SparseArray mCallbacks = new SparseArray<>();

 @Override
 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setRetainInstance(true);
 }

 public void startForResult(Intent intent, ActResultRequest.Callback callback) {
  mCallbacks.put(callback.hashCode(), callback);
  startActivityForResult(intent, callback.hashCode());
 }

 @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);
  }
 }
}

请求封装类:

public class ActResultRequest {

 private onActResultEventDispatcherFragment fragment;

 public ActResultRequest(Activity activity) {
  fragment = getEventDispatchFragment(activity);
 }

 private onActResultEventDispatcherFragment getEventDispatchFragment(Activity activity) {
  final FragmentManager fragmentManager = activity.getFragmentManager();

  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);
 }
}

发送请求和监听请求的代码:

Intent intent = new Intent(this, SecondActivity.class);

request.startForResult(intent, new ActResultRequest.Callback() {
 @Override
 public void onActivityResult(int resultCode, Intent data) {
  Toast.makeText(MainActivity.this, "" + resultCode, Toast.LENGTH_SHORT).show();
 }
});

题外话:

最新的support包已经解决了fragment嵌套时里层的fragment收不到结果的问题,请及时更新依赖。

总结

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/155634.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号