用Dart&Henson玩转Activity跳转
用Dart&Henson玩转Activity跳转
Extra是Android标准的组件之间(Activity/Fragment/Service等)传递数据的方式。本文介绍了开源项目Dart的使用,它优雅的处理了组件间跳转和数据传递
内容提要
- 传统的方式
- Dart & Henson
- 小改进建议
本文中所演示的例子sample代码位于DartHensonSample
传统的方式
会Android的人都会这个的,这里就简单说下,一般流程是
- 定好传递数据对应的Key
- SecondActivity设置好属性,通过
getIntent().getXXXExtra()
获得数据 - FirstActivity通过
intent.putExtra()
设置数据,并执行startActivity()
具体这里就不在贴上代码了,主要讲讲这里会导致的一些问题。
- 首先这个Key要保持维护状态,有时候前后两个Activity不是同一个写的,Key的使用交流会出现误解或者指定错误
- 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 age
和User 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跳转的更多相关文章
- Android之Activity跳转
简述 如果把每个activity看成一个页面的话,那么activity之间的跳转和页面的之间的跳转基本上是一样的.首先需要监听一个事件,当这个事件发生的时候,就进行跳转.html中有个<a sr ...
- android activity 跳转传值问题研究
intent = new Intent(); intent.setClass(LoginActivity.this, RegActivity.class); startActivity(intent) ...
- 【原创】Android 从一个Activity跳转到另外一个Activity
Android四大组件activity使用,实现两个activity之间的跳转 基本流程:创建两个activity-将其中一个activity中组件作为事件源-通过组件事件的处理借助intent对象实 ...
- tabhost中activity跳转动画不显示的解决办法
[1]如果是tabhost中的activity跳到其他的activity,用这篇blog的方法即可 http://blog.sina.com.cn/s/blog_8db8914301010t31.ht ...
- android 15 activity跳转
从一个屏幕跳到另一个屏幕,一个activity跳转到另一个activity,Intent类用于组件之间传递数据和跳转,组件包括不仅activity. package com.sxt.day04_01; ...
- Android Activity跳转动画,让你的APP瞬间绚丽起来
我们都知道绚丽的APP总会给用户耳目一新的感觉,为了抓住用户更大网络公司使出浑身解数让自己的产品更绚丽,而绚丽最简单的效果就是Activity跳转效果,不仅可以让用户看起来舒服,而且实现起来也特别简单 ...
- Activity跳转时传递Bitmap对象的实现
前言 相信大家可能都了解Activity跳转时我们是能够传递參数的,比方使用Intent传递或者Bundle来传递,把当前Activity的一些信息传递给将要跳转到的新的Activity.可是不知道大 ...
- Android的Activity跳转动画各种效果整理
Android的Activity跳转就是很生硬的切换界面.其实Android的Activity跳转可以设置各种动画,本文整理了一些,还有很多动画效果,就要靠我们发挥自己的想象力 大家使用Android ...
- android入门,activity跳转,并传递message
首先是布局文件,如下: activity_main.xml <?xml version="1.0" encoding="utf-8"?> <L ...
随机推荐
- 小说一下case ~
case 这个关键词,用的地方不少~大部分的用途都通过以下的方式去应用 SELECT CASE @i END AS 测试1; 测试1 ----------- DECLARE @Hour INT = D ...
- MySQL 优化之 Linux系统层面调优
MySQL 一般运行于Linux系统中.对于MySQL的调优一般分为Linux操作系统层面的调优和MySQL层面的调优(当然还有架构层面.业务层面.应用程序层面的调优).操作系统主要是管理和分配硬件资 ...
- 将表里的数据批量生成INSERT语句的存储过程 继续增强版
文章继续 桦仔兄的文章 将表里的数据批量生成INSERT语句的存储过程 增强版 继续增强... 本来打算将该内容回复于桦仔兄的文章的下面的,但是不知为何博客园就是不让提交!.... 所以在这里贴出来吧 ...
- W3School-CSS 字体(font)实例
CSS 字体(font)实例 CSS 实例 CSS 背景实例 CSS 文本实例 CSS 字体(font)实例 CSS 边框(border)实例 CSS 外边距 (margin) 实例 CSS 内边距 ...
- 烂泥:Linux源码包制作RPM包之Apache
本文由秀依林枫提供友情赞助,首发于烂泥行天下 公司服务器比较多,需要把apache源码包制作成rpm包,然后放到公司内网yum源上进行下载安装.apache的rpm包安装方式比源码安装方式比较快,这能 ...
- android 布局下划线
<LinearLayout android:layout_width="match_parent" android:layout_height="wrap_cont ...
- JAVA-android 更改APP名称与图标
首先要在你的资源文件放入你想换的图标图片拖到drawable-XX文件夹下,然后你打开AndroidManifest.xml这个配置清单文件找到application标签里的这句android:ico ...
- java报表工具FineReport使用中遇到的常见报错及解决办法(三)
这里写点抛砖引玉,希望大家能把自己整理的问题及解决方法晾出来,Mark一下,利人利己. 出现问题先搜一下文档上有没有,再看看度娘有没有,再看看论坛有没有.有报错要看日志.下面简单罗列下常见的问题,大多 ...
- Android蓝牙实例(和单片机蓝牙模块通信)
最近做毕设,需要写一个简单的蓝牙APP进行交互,在网上也找了很多资料,终于给搞定了,这里分享一下^_^. 1.Android蓝牙编程 蓝牙3.0及以下版本编程需要使用UUID,UUID是通用唯一识别码 ...
- 【温故而知新-Javascript】使用canvas元素(第二部分)
本文将继续介绍canvas的功能,展示如何绘制更复杂的图形(包括圆弧和曲线),如何使用剪裁区域来限制操作以及如何绘制文本.还是介绍可以应用在画布上的特效和变换,包括阴影.透明度.旋转和坐标重映射. 1 ...