你好,欢迎进入江苏优软数字科技有限公司官网!

诚信、勤奋、创新、卓越

友好定价、专业客服支持、正版软件一站式服务提供

13262879759

工作日:9:00-22:00

intellij idea activiti 如何在Android中应用Kotlin?带你感受它的美与优雅

发布时间:2025-08-17

浏览次数:0

[]

先前的一篇文章中,我们初步了解了这种新语言的长处,也接触了部分基础语法及其简单应用,相信你已对其产生很大兴趣,姑且称之为兴趣吧,哈哈。那么,我们该如何在实际中使用这门新语言呢?本文将引导你学习用它来开发应用,并与传统语言Java进行对比intellij idea activiti,让你切实体会到它的美好与精妙。

[]

项目文件

[id_940904582]'com.android.application'
apply plugin:'kotlin-android'
apply plugin:'kotlin-android-extensions'
dependencies {    classpath 将模块名分开表述,版本号单独列出,用逗号连接,并保持名称和版本号完整不变,同时将长句拆分成两个部分,分别是模块标识和版本信息,两者之间用逗号隔开。
}

app 文件:

compile 将库名称为kotlin-stdlib的版本1.1.1的组件禁止使用,该组件属于库org.jetbrains.kotlin,版本号为1.1.1
SDK15同样可用, SDK19同样可用, SDK21同样可用, SDK23同样可用。
compile 该库的标识符为org.jetbrains.anko, 版本代号anko-sdk25, 具体版本号为0.10.0-beta-1
compile 使用org.jetbrains.anko库中的anko-appcompat-v7组件版本为0.10.0-beta-1

Anko

借助前面的设置,你将注意到其中包含了名为anko的依赖项。Anko是由开发者创建的一个功能强大的库,提及它,就令人惊叹。该语言由他们设计,最流行的开发环境idea也是出自他们之手,AS则是在IDEA的基础上构建的。现在,回到正题,Anko是官方推出的一款旨在提升应用开发效率、简化过程的库,同时还能让编写的代码更加简洁明了、易于理解。它包括多个部分,如下

那么接下来,我们就通过代码来理解语言开发的优势所在。

再也不用

从事过编程工作的人都会明白,编写大量的界面配置文档同样是一项繁重的任务,不仅需要事先声明标识,接着还要将它们强制转换为对应的组件,其操作流程通常是这样的

TextView username;
用户名变量获取了id为user的文本视图组件
username.setText("我是一个TextView");

有时候文字表达起来令人不适,或许有人认为,当前存在一些标注的集合,比如,在运用标注时,可以不再需要,具体操作方法如下

@BindView(R.id.user)
TextView username;
username.setText("我是一个TextView");

确实如此,运用标注后确实减轻了我们的工作量,但这种方式并非最为简化,最为便捷的方法是我们可以直接为id为user的元素进行赋值,或许有人会觉得这有些难以置信,不过确实实现了,我们可以直接这样编写

user.text="我是一个TextView"

你瞧见此景,是否顿生相逢太迟之感,其精练程度实在令人赞叹。使用者即是我们于布局文档中所标示的标识符,文本内容则仿佛等同于括号内的赋值。在编程语境里,已无类似Java语言中那种set和get的操作方法。务必留意,倘若我们打算这般运用(无需逗号,直接运用xml组件),则必须在其中添入特定的指令,即应用一个以“--”开头的注解

//activity_login就是我们的布局
importkotlinx.android中的布局文件activity_login下的所有元素,都被自动创建了对应的合成变量,并且可以直接在代码中使用,无需额外声明

Anko

我们一般借助xml文档来构建界面,这种方式的不足之处在于缺乏类型保障,也缺少空值校验,并且解析xml会耗费额外的处理器资源与电力。Anko则能通过DSL动态生成用户界面,相比用Java编写动态布局更为便捷,主要是因为它更加精炼。这种工具与xml布局的层级结构相呼应,有助于提升代码的可读性。

verticalLayout {
那个文本视图被初始化了,接着它被赋值给变量textView"我是一个TextView")
把那个名字赋值给变量val,通过输入框获取"EditText")
            button("Button") {
触发响应时,显示提示信息,内容为"${name.text}!") }
            }
        }

删除原方法部分,然后引入上方代码,即可呈现如下景象,即一个垂直排列的线性结构里,包含了某项,某项,以及某项。并且其中设有交互响应,当触发该响应时,会获取的内容

以toast显示。

这段代码是否十分容易理解,当然,系统自带的组件无法满足我们的要求,比如我们会调整文字的色彩和尺寸,会设定宽度和高度,会设定属性,那么怎样完成呢,当然也很容易,因为它的运作方式与xml编写布局是相似的,例如以下做法

val textView=textView("我是一个TextView"){
        textSize = sp(17).toFloat()
textColor变量赋值为context的resources对象获取的红色颜色值
       }.lparams{
           margin=dip(10)
           height= dip(40)
           width= matchParent
       }

无需解释上文代码,你应当能领会控件产生的实际作用。它的特性与我们在XML文件中设定的属性名称完全吻合。

在构建界面时intellij idea activiti,我们通常将界面生成的代码直接放置在方法体内,其实还存在其他实现方式。可以考虑定义一个内部类来履行特定接口,接着重写其中的方法,此方法需要负责生成并返回一个视图对象,该视图对象即为我们要构建的界面布局。具体调整如下

内部界面组件:Anko组件 {
重新定义函数生成视图,参数为Anko上下文环境,使用覆盖方法实现): View {
           return with(ui){
垂直布局,从上往下排列,各个元素依次堆叠,没有横向扩展,保持单一列的形态,确保内容清晰,层次分明,每个项目独立存在,互不干扰,整体呈现简洁明了的结构特征,符合垂直排列的设计规范,突出重点,易于阅读,避免混乱,保持统一的视觉风格,强调垂直方向的连贯性,确保信息传递的效率,适应不同屏幕尺寸,保持布局的稳定性,不会产生错位或重叠,维护界面的整洁性,提升用户体验的流畅度。
创建一个文本视图,这个文本视图显示文本内容为我是文本视图,通过匿名内部类的方式实现,这个匿名内部类继承自文本视图的构造函数参数。
字体大小等于十七点五的值转换成浮点数
设置文本颜色为资源中的红色值
                   }.lparams{
距离等于沉落十单位
高度等于四十分之一寸
宽度等于父容器的大小
                   }
把文本框的值赋给变量名,通过调用编辑文本组件实现
按下那个标有文字的图形控件,会触发相应的功能操作,这个控件被称为按钮
触发操作时,界面元素会响应,进而产生相应动作,接着界面会展现特定内容。
发出提示信息,内容为问候语,对象是变量name.text的值,采用通知形式进行传达
                        }
                   }
               }
           }
        }
    }

然后在方法中加一句代码,即可创建我们的布局页面了。如下

UI().setContentView(this@LoginActivity)

我们进行编译和执行,看到呈现的界面与布局文件设定的样子完全相同。不过,它在运行效率上确实有好处,只是实际上并没有明确感觉到这种效率提升。无论如何,这种DSL确实方便理解,也很简单掌握,在前面展示的代码里,或许留意到了dip(10),它意味着将10dp换算成像素,属于Anko提供的附加功能,提及附加功能,倘若研究过Anko的内部实现,会发现其中频繁运用扩展函数,这也是语言特性的一种体现。确实非常厉害,比如dip功能(取自View功能)

函数 View.dip 接收一个 Int 类型的参数 value, 返回一个 Int 类型的结果, 该函数实际调用 context 对象的 dip 方法, 并传入 value 参数
fun Context.浸泡数值为值:整数类型返回整数类型 =
资源显示指标密度乘以值,转换成整数值

那个东西和我们Java的用法没什么两样,但是看起来是不是比Java的写法要顺眼些,我个人是这么认为的。

我们先前为其附加了交互响应,注意到它具备表达式处理能力。若需展示提示信息,仅需调用toast("信息")即可,操作相当精简。该功能本质上是通过扩展函数来实现的

inline fun AnkoContext<*>显示提示信息,内容为指定文本,调用上下文中的方法实现
显示提示信息时,系统会调用Context的toast方法,此方法需要传入一个文本字符串作为参数,随后系统会构建一个Toast对象并展示出来this, 弹出提示信息, 设置为简短显示, 立即呈现

当然创建依然也很简单,如下

            alert ("我是Dialog"){
确认键,弹出提示信息,内容为是"yes")}
不可以有按钮,显示提示信息"no")}
                    }.show()

越看越觉得心情愉悦,哈哈。接下来,呈现一个既强大又极其简明扼要的代码片段实现。

        doAsync {            //后台执行代码
            uiThread { 
            //UI线程
            toast(当前执行脉络的名称为,线程,是,${Thread.currentThread().name},这个。) }
        }

这段代码达成的功能与Java版本相似,不过你需要留意,它的表达方式明显更为精炼,当然,假如你视力正常,应该能够领会到这种精简的好处。

运用一段时间后,能够感受到它显著降低了代码的编写量,至于其它的长处和功能,还需要我们自行发掘。通过深入探究,你会对其产生意想不到的震撼。

实现一个简单的登录界面

界面很简单,伪代码

这个实现并不显得复杂,因此xml的代码内容不在此展示,如果你需要了解xml的实现方式,可以继续看下去,下面将专门展示Anko在代码层面如何完成这个布局。

intellij idea activiti_Kotlin开发Android应用_Anko库使用教程

初始化变量et_account,其类型为EditText
未初始化变量et_password为编辑框类型
内部类登录界面:一个Anko组件 {
        override fun createView(ui: AnkoContext) = with(ui) {
            verticalLayout {
背景颜色等于上下文资源中的颜色值,背景色由上下文资源提供,具体值是上下文资源里的颜色属性
获取白色色彩值,通过系统资源引用方式实现 重力值设为居中水平值 设置图片视图显示默认图标,接着调整其布局参数,具体为, 宽度等于一百个密度无关像素 高度等于下坠值一百 topMargin 设置为 64 像素的值,采用 dp 单位转换                }                linearLayout { 重力值设为垂直居中 方向是水平方向 背景资源被设置为 bg_frame_corner 图片 图片视图不允许 图片 = 资源获取Drawable图标(R.mipmap.ic_username) 设置宽度为包裹内容,高度为包裹内容,。 左边空白设置为十二个单位,单位是密度无关像素 设置右侧空白为十五个单位,以适配界面布局,确保元素间距适宜,提升视觉舒适度。                    } 账户信息 = 输入框 { 提示是进入账号 hintTextColor = 设置为深灰色调色值 字号大小设定为十六点零 背景为空                    } }.设置宽度为300个单位,高度为40个单位,进行布局参数配置 topMargin的值等于四十五个单位,单位名称为dip                }                linearLayout {                    orientation = HORIZONTAL                    backgroundResource = R.drawable.bg_frame_corner 重力值设为中心位置_VERTICAL                    imageView { image是获取到的资源中的密码图标 }.布局参数设置如下,具体值分别为,宽度采用匹配父布局,高度设置为wrap_content,重力中心位于左上角,其他属性均保持默认值                        leftMargin = dip(12)                        rightMargin = dip(15)                    } et_password是一个文本输入框,用来输入密码,这个输入框具有特定的属性,其中包括密码隐藏功能 提示信息为账号安全码,用于验证身份,请妥善保管,不要泄露给他人,定期更换,以保障账户安全,防止被盗用,确保个人信息安全。                        hintTextColor = Color.parseColor("#666666")                        textSize = 16f                        background = null                    }                }.lparams { 宽度等于三百个密度无关像素 高度等于沉陷值四十分 topMargin 设置为 十个设备独立像素单位的高度                }                button("登录") {                    gravity = Gravity.CENTER 背景 = 资源管理器获取的drawable对象,其标识符为R.drawable.bg_login_btn textColor采用Color类中的parseColor方法,参数值为十六进制字符串ffffff,最终得到白色颜色值                    onClick { 倘若该账户文本字段非空,并且
如果密码文本不为空,且密码文本的字符串表示不为空 启动新任务,切换到另一项操作,执行不同的功能,进入新的界面()
否则提示输入账号或密码                    } }.布局宽度设为300个单位,布局高度设为44个单位,其中单位为密度无关像素 topMargin 等于 18 像素的转换值                }                linearLayout {                    orientation = HORIZONTAL                    gravity = Gravity.CENTER_VERTICAL 设置勾选框"保持密码选项"时,点击该框, textColor 设置为十六进制颜色值 #666666                        textSize = 16f 设置左侧填充值为五单位尺寸                    } 显示隐私条款,然后进行说明,包括使用规范,用户权利,以及数据保护措施,同时强调遵守的重要性,并要求确认理解,最后结束提示。 textColor这个变量赋值为Color类中parseColor方法解析得到的颜色值,该颜色值为十六进制字符串#1783e3 重力设置为向右方向                        textSize = 16f 设置宽度为父容器匹配模式。 设置宽度为300个单位,采用像素单位,对布局元素进行约束,完成参数配置。                    topMargin = dip(18)                } 显示版权声明,内容为Code4Android所有,年份为当前时间,采用无框设计,字体为默认系统字体,大小为中等,颜色为黑色,对齐方式为居中,背景为透明,点击后无响应,长按后显示菜单,菜单项包括复制和分享,复制内容为版权声明,分享方式为系统默认,分享内容为版权声明,同时显示在屏幕顶部中央位置,不随页面滚动,动画效果为淡入淡出,完成后隐藏,不占用系统资源,不显示提示信息,不记录用户行为,不影响其他应用运行,不收集用户数据,不要求用户授权,不进行网络请求,不使用外部库,不创建临时文件,不修改系统设置,不安装任何软件,不进行任何恶意操作,仅用于展示目的,不包含任何广告,不包含任何链接,不包含任何二维码,不包含任何弹窗,不包含任何提示框,不包含任何对话框,不包含任何输入框,不包含任何按钮,不包含任何图片,不包含任何文字,不包含任何图标,不包含任何图形,不包含任何动画,不包含任何声音,不包含任何视频,不包含任何3D效果,不包含任何AR效果,不包含任何VR效果,不包含任何MR效果,不包含任何MR效果,不包含任何MR效果,不包含任何MR效果,不包含任何MR效果,不包含任何MR效果,不包含任何MR效果,不包含任何MR效果,不包含任何MR效果,不包含任何MR效果,不包含任何MR效果,不包含任何MR效果,不包含任何MR效果,不包含任何MR效果,不包含任何MR效果,不包含任何MR效果,不包含任何MR效果,不包含任何MR效果,不包含任何MR效果,不包含任何MR效果,不包含任何MR效果,不包含任何MR效果,不包含任何MR效果,不包含任何MR效果,不包含任何MR效果,不包含任何MR效果,不包含任何MR效果,不包含任何MR效果,不包含任何MR效果,不包含任何MR效果,不包含任何MR效果,不包含任何MR效果,不包含任何MR效果,不包含任何MR效果,不包含任何MR效果,不包含任何MR效果,不包含任何MR效果,不包含任何MR效果,不包含任何MR效果,不包含任何MR效果,不包含任何MR效果,不包含任何MR效果,不包含任何MR效果,不包含任何MR效果,不包含任何MR效果,不包含任何MR效果,不包含任何MR效果,不包含任何MR效果,不包含任何MR效果,不包含任何MR效果,不包含任何MR效果,不包含任何MR效果,不包含任何MR效果,不包含任何MR效果,不包含任何MR效果,不包含任何MR效果,不包含任何MR效果,不包含任何MR效果,不包含任何MR效果,不包含任何MR效果,不包含任何MR效果,不包含任何MR效果,不包含任何MR效果,不包含任何MR效果,不包含任何MR效果,不包含任何MR效果,不包含任何MR效果,不包含任何MR效果,不包含任何MR效果,不包含任何MR效果,不包含任何MR效果,不包含任何MR效果,不包含任何MR效果,不包含任何MR效果,不包含任何MR效果,不包含任何MR效果,不包含任何MR效果,不包含任何MR效果,不包含任何MR效果,不包含任何MR效果,不包含任何MR效果,不包含任何MR效果,不包含任何MR效果,不包含任何MR效果,不包含任何MR效果,不包含任何MR效果,不包含任何MR效果,不包含任何MR效果,不包含任何MR效果,不包含任何MR效果,不包含任何MR效果,不包含任何MR效果,不包含任何MR效果,不包含任何MR效果,不包含任何MR效果,不包含任何MR效果,不包含任何MR效果,不包含任何MR效果,不包含任何MR效果,不包含任何MR效果,不包含任何MR效果,不包含任何MR效果,不包含任何MR效果,不包含任何MR效果,不包含任何MR效果,不包含任何MR效果,不包含任何MR效果,不包含任何MR效果,不包含任何MR效果,不包含任何MR效果,不包含任何MR效果,不包含任何MR效果,不包含任何MR效果,不包含任何MR效果,不包含任何MR效果,不包含任何MR效果,不包含任何MR效果,不包含任何MR效果,不包含任何MR效果,不包含任何MR效果,不包含任何MR效果,不包含任何MR 设置字体大小为十四点零,使用点浮点数表示 重力值设为居中定位或底部定位                }.lparams { bottomMargin 设置为 35 像素单位,采用dp转换方式 权重值设定为0点一零                }            }        }    }

这段代码如何,看起来相当不错,即便目前你不会编写,依然能够明白它的内容。在前面我们为登录按钮设定了一个触发打开的动作。其中注明了需要跳转的,若要向打开的界面传递内容,直接放在括号里面。比如我们要把输入的账号和密码送到跳转的页面,那么就应该这样完成

startActivity("account"将账号文本内容提取出来,转换成字符串形式,"password" 
将密码输入框中的内容转换成字符串形式,然后赋值给密码变量

Anko的卓越之处并不仅限于此,非常值得深入探究。若想进一步钻研,可以前往相关资源。那么,这篇文章到此就告一段落了。如果在阅读过程中发现任何问题,敬请告知,感谢。

如有侵权请联系删除!

13262879759

微信二维码