用Dart&Henson玩转Activity跳转

Extra是Android标准的组件之间(Activity/Fragment/Service等)传递数据的方式。本文介绍了开源项目Dart的使用,它优雅的处理了组件间跳转和数据传递

内容提要

  • 传统的方式
  • Dart & Henson
  • 小改进建议

本文中所演示的例子sample代码位于DartHensonSample

传统的方式

会Android的人都会这个的,这里就简单说下,一般流程是

  1. 定好传递数据对应的Key
  2. SecondActivity设置好属性,通过getIntent().getXXXExtra()获得数据
  3. FirstActivity通过intent.putExtra()设置数据,并执行startActivity()

具体这里就不在贴上代码了,主要讲讲这里会导致的一些问题。

  1. 首先这个Key要保持维护状态,有时候前后两个Activity不是同一个写的,Key的使用交流会出现误解或者指定错误
  2. SecondActivity中有些传入的数据可能是必须的,但是对于这个FirstActivity的作者可并不知道啊

好在Dart这个开源项目顺利的处理了上述等问题,而且处理的非常优雅。

Dart & Henson

Dart的原理和ButterKnife类似,都是通过注解处理器在编译阶段生成一些代码。所以你再写好一些注解后,必须要构建一些项目才能生成一些后面你所需要的代码(后面会详细说明)。

首先引入android-apt,在项目gradle中加入插件

buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
}
}

再在build.gradle引用

apply plugin: 'android-apt'

引入Dart & Henson(Henson实际是Dart项目的子项目)

compile 'com.f2prateek.dart:dart:2.0.0'
provided 'com.f2prateek.dart:dart-processor:2.0.0'
compile 'com.f2prateek.dart:henson:2.0.0'
provided 'com.f2prateek.dart:henson-processor:2.0.0'

这里我们假设要从MainActivity跳转到DetailActivity,DetailActivity中要接受三个参数分别是String name,int ageUser user。这里的user是一个自定义类型,我们知道要想传递数据,必须序列化,文的例子中引入了Parceler项目通过同样一个注解@Parcel自动在编译器声场Parcelable的繁杂的代码:User.java

DetailActivity需要接受上述三个参数,仅仅通过@InjectExtra注解即可,然后在onCreate中执行Dart.inject(this),详细的代码为:

public class DetailActivity extends AppCompatActivity {
@InjectExtra
String name = "default name"; @InjectExtra
int age = 0; @Nullable
@InjectExtra
User user; @BindView(R.id.tvName)
TextView tvName; @BindView(R.id.tvAge)
TextView tvAge; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_detail);
ButterKnife.bind(this);
Dart.inject(this);
initView();
} private void initView() {
// 使用name,age,user
}
}

String name = "default name";这句话给了name一个默认值,但是当Dart.inject执行后会被传递过来的数据覆盖。

@Nullable加在了user上说明这个数据可以不用传递。接受端就这么多代码,下面让我们看看发送端如果发送数据,如何跳转到DetailActivity。

注意编写上述代码后,我们要先编译下项目,编译好后Henson会通过注解处理器生成可以跳转到DetailActivity的DSL(领域特定语言)段,方便其他组件对DetailActivity的跳转,我们在MainActivity上只要写上下列代码,即可完成界面跳转和数据传递:

User user = new User();
user.setAge(Integer.parseInt(age.getText().toString()));
user.setName(name.getText().toString());
startActivity(
Henson.with(this)
.gotoDetailActivity()
.age(27)
.name("jason")
.user(user)
.build()
);

当你写完Henson.with(this)后代码提示会自动弹出.gotoDetailActivity(),Henson帮助你提示你DetailActivity是可以被跳转的;随后你继续写下.gotoDetailActivity()后,又自动弹出.age()方法,提示你传入一个int类型给age,写好后,又自动弹出.name()方法,以此类推,最后以一个build()收场。

注意,这里你可以不写.user(),因为在DetailActivity中我们指定它是nullable的,可以不传。但是.age().name()都是会强制弹出让你填写数据的。

至此,Henson&Dart的基本介绍结束。

小改进建议

Dart还有一个@HensonNavigable注解,它标注在将会被跳转到的Activity的classname上,说明这个activity可以被跳转,会自动生成.gotoXXXActivity()这样的代码,但是它不能在这个类中存在@InjectExtra注解,这里总觉得这个注解有些多余。

第二,和Dart项目的作者提了issue问了关于参数指定的顺序问题,上述例子中我们传递数据的代码是:

 Henson.with(this)
.gotoDetailActivity()
.age(Integer.parseInt(age.getText().toString()))
.name(name.getText().toString())
.build()

但是如果我偏向要对调name和age呢?发现不行~如果你写完.gotoDetailActivity()后发现只有.age()的提示,却没有.name()的,即强制要求你先传递age。这里作者说明后才知道他们是按照字幕顺序来排数据传入的,目前没有更好的方法。

欢迎你开心的使用Dart & Henson!

用Dart&Henson玩转Activity跳转的更多相关文章

  1. Android之Activity跳转

    简述 如果把每个activity看成一个页面的话,那么activity之间的跳转和页面的之间的跳转基本上是一样的.首先需要监听一个事件,当这个事件发生的时候,就进行跳转.html中有个<a sr ...

  2. android activity 跳转传值问题研究

    intent = new Intent(); intent.setClass(LoginActivity.this, RegActivity.class); startActivity(intent) ...

  3. 【原创】Android 从一个Activity跳转到另外一个Activity

    Android四大组件activity使用,实现两个activity之间的跳转 基本流程:创建两个activity-将其中一个activity中组件作为事件源-通过组件事件的处理借助intent对象实 ...

  4. tabhost中activity跳转动画不显示的解决办法

    [1]如果是tabhost中的activity跳到其他的activity,用这篇blog的方法即可 http://blog.sina.com.cn/s/blog_8db8914301010t31.ht ...

  5. android 15 activity跳转

    从一个屏幕跳到另一个屏幕,一个activity跳转到另一个activity,Intent类用于组件之间传递数据和跳转,组件包括不仅activity. package com.sxt.day04_01; ...

  6. Android Activity跳转动画,让你的APP瞬间绚丽起来

    我们都知道绚丽的APP总会给用户耳目一新的感觉,为了抓住用户更大网络公司使出浑身解数让自己的产品更绚丽,而绚丽最简单的效果就是Activity跳转效果,不仅可以让用户看起来舒服,而且实现起来也特别简单 ...

  7. Activity跳转时传递Bitmap对象的实现

    前言 相信大家可能都了解Activity跳转时我们是能够传递參数的,比方使用Intent传递或者Bundle来传递,把当前Activity的一些信息传递给将要跳转到的新的Activity.可是不知道大 ...

  8. Android的Activity跳转动画各种效果整理

    Android的Activity跳转就是很生硬的切换界面.其实Android的Activity跳转可以设置各种动画,本文整理了一些,还有很多动画效果,就要靠我们发挥自己的想象力 大家使用Android ...

  9. android入门,activity跳转,并传递message

    首先是布局文件,如下: activity_main.xml <?xml version="1.0" encoding="utf-8"?> <L ...

随机推荐

  1. 教你手工mysql拆库

    互联网网站应用大多采用mysql作为DB存储,限于mysql单机性能的瓶颈,为了支撑更大容量和更大的访问量,dba一般通过建立分布式集群,让多个mysql共同提供服务.所谓的mysql分布式集群,实质 ...

  2. SQL Server 用链接服务器 同步MySQL

    --测试环境SQL 2014 在MySql环境: use test ; Create Table Demo(ID int,Name varchar(50)) 在控制面板—管理工具—数据源(ODBC)— ...

  3. 高性能MySQL笔记:第1章 MySQL架构

    MySQL 最重要.最与众不同的特性是他的存储引擎架构,这种架构的设计将查询处理(Query Precessing)及其系统任务(Server Task)和数据的存储/提取相分离.   1.1 MyS ...

  4. js中的继承

    js中继承的实现方式很多,此处给出两种常用方式. <!DOCTYPE html> <html> <head> <meta charset='UTF-8'> ...

  5. 【2016-10-14】【坚持学习】【Day5】【单例模式】

    今天学习第二个模式:单例模式.只允许系统有一个实例运行,提供全局访问该实例的公共方法. class Singleton { private static Singleton instance=null ...

  6. 分页查询的两种方法(双top 双order 和 row_number() over ())

    --跳过10条取2条 也叫分页select top 2 * from studentwhere studentno not in (select top 2 studentno from studen ...

  7. 平面直接坐标系线段相交问题(小Q(钟神)的问题)

    [问题描述] 小 Q 对计算几何有着浓厚的兴趣.他经常对着平面直角坐标系发呆,思考一些有趣的问题.今天,他想到了一个十分有意思的题目:首先,小 Q 会在?轴正半轴和?轴正半轴分别挑选?个点.随后,他将 ...

  8. [No000056]你无法真正占有一个人,包括你的爱人,先生或太太、小孩,以及你自己....

    从一出生,我们的双手就握的紧紧的,好像深知自己会失去什么 很多人迷信多子多孙才是福,老来才有依靠,但太多新闻告诉我们,很多人老了,子孙为了分家产,反而让他生不如死,死了还无法入土为安. 现实也告诉我们 ...

  9. jquery中取消和绑定hover事件的正确方式

    在网页设计中,我们经常使用jquery去响应鼠标的hover事件,和mouseover和mouseout事件有相同的效果,但是这其中其中如何使用bind去绑定hover方法呢?如何用unbind取消绑 ...

  10. PagerHelper-分页类

    2016.01.29   public static class PagerHelper { #region 数字分页类 /// <summary> /// /// </summar ...