Splitties(一)-安卓基础库

文章目录[x]
  1. 1:Splitties介绍
  2. 2:Android基础库
  3. 2.1:activities库
  4. 2.2:appcxt库
  5. 2.3:bitflags库
  6. 2.4:bundle库
  7. 2.5:Collections库
  8. 2.6:Dimensions库
  9. 2.7:Fragments库
  10. 2.8:fragmentargs库
  11. 2.9:lifecycle-coroutines库
  12. 2.10:mainhandler库
  13. 2.11:mainthread库
  14. 2.12:material-colors库
  15. 2.13:permissions库
  16. 2.14:resources库
  17. 2.15:systemservices库
  18. 2.16:toast库
  19. 2.17:view库
  20. 3:使用所有基础库

Splitties介绍

在过去的19年12月初,Kotlin项目组下多达15k starAnko项目宣布被废弃。在宣布废弃的文章中,Anko强推了项目Splitties

Splitties是小型Kotlin跨平台库的集合(以Android为第一个目标)。

这些库旨在减少必须编写的代码量,减少代码的读写时间,因此可以将更多精力放在要为用户构建的代码上。

该项目被命名为“ Splitties”,因为它被拆分为多个小模块,并作为独立的库分发,因此可以仅将所需的模块添加到的项目/模块中,以帮助减少用户设备需要下载的最终二进制文件的大小。

某些Android模块的内容类似于Anko提供的内容。 每个模块的设计都占用很小的空间,并且要尽可能地高效。

 

Android基础库

Splitties的最新版本为3.0.0-alpha06,可以在顶级的build.gradlebuildscript块下配置:

ext.splitties_version = '3.0.0-alpha06'

这些库不包含AppCompat和适合WearOS的应用。

activities库

要使用这个库添加如下依赖:

implementation("com.louiscad.splitties:splitties-activities:$splitties_version")

该库以最少的样板代码来开始一个Activity

 

Contextstart扩展函数利用了修饰的类型参数:

start<LoginActivity>()
 
 start<LoginActivity>{
   setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK)
 }

 

有一个可选的lambda,其中Intent是接收者,因此可以在Activity开始之前对其进行编辑(例如,添加标志)。

appcxt库

要使用这个库添加如下依赖:

implementation("com.louiscad.splitties:splitties-appctx:$splitties_version")

该库始终将appCtx放在的应用程序上下文中。

提供了两个只读属性:

  • appCtx :返回应用程序上下文
  • directBootCtx :(如果有)用于涉及存储的直接启动感知组件。

它还将Context的这两个扩展方法引入了高级用法:

  • injectAsAppCtx()
  • canLeakMemory()

在使用该库后可以在应用程序中的任何位置使用appCtxdirectBootCtx出现持有ActivityContext时容易引发的内存泄露问题。

bitflags库

要使用这个库添加如下依赖:

implementation("com.louiscad.splitties:splitties-bitflags:$splitties_version")

LongIntShortByte及其无符号对应项加上了hasFlagwithFlagminusFlag扩展。这些扩展使处理位标志更加容易。

bundle库

要使用这个库添加如下依赖:

implementation("com.louiscad.splitties:splitties-bundle:$splitties_version")

BundleSpecBundle与属性语法一起用于Intent Extras等。

  • 假设有一个名为DemoActivityActivity子类。
  • DemoActivity中,添加一个名为ExtrasSpec的嵌套对象。
  • 使它继承BundleSpec
  • 对于需要的每个所需的Intent Extra,在ExtrasSpec中,添加一个由bundle()委托的具有显式非null类型的var属性。
  • 设置启动ActivityIntent时,在其上调用putExtras(DemoActivity.ExtrasSpec){…},并在lambda中的ExtrasSpec属性上设置值。
  • DemoActivity中,调用withExtras(ExtrasSpec){…}以从lambda中获取额外内容作为属性。

其具体的代码如下:

class DemoActivity : AppCompatActivity() {

object ExtrasSpec : BundleSpec() {

var userName: String by bundle() // 必要的参数

var showGreetingToast by bundleOrDefault(false) //可选参数默认为false

var optionalExtra: String? by bundleOrNull() // 附加参数

}

override fun onCreate(savedInstanceState: Bundle?) {

super.onCreate(savedInstanceState)

withExtras(ExtrasSpec) {

if (showGreetingToast) toast(android.R.string.ok)

optionalExtras?.forEach {

Timber.i("Character from optional extra: $it")

}

}

restOfYourCode()

}

}

class StartDemoActivity : AppCompatActivity() {

private fun someFunction(name: String, isUserPolite: Boolean = false) {

startActivity(Intent(this, DemoActivity::class.java).apply {

putExtras(DemoActivity.ExtrasSpec) {

userName = name

showGreetingToast = isUserPolite

}

})

}

}

 

Collections库

要使用这个库添加如下依赖:

implementation("com.louiscad.splitties:splitties-collections:$splitties_version")

扩展了forEach用于没有迭代器分配的List

ListforEachByIndexforEachWithIndex扩展功能使可以在List上进行迭代,而无需分配Iterator

当需要在对性能有严格要求的条件下对List进行迭代时(例如,从onDraw方法执行/调用的代码,或更一般地在UI线程上运行的代码),此功能非常有用。

还具有反向等效项:forEachReversedByIndexforEachReversedWithIndex

 

Dimensions库

要使用这个库添加如下依赖:

implementation("com.louiscad.splitties:splitties-dimensions:$splitties_version")

用于视图和上下文的Android dp扩展,在使用Views DSL时特别方便。

ViewContext上的dipdp扩展功能采用Int参数,并在Androiddp中返回值。 前者(dip)返回一个Int,而后者(dp)返回一个Float。

val minTapTargetSize = dip(48)
val circleDiameter = dp(48)

 

Fragments库

要使用这个库添加如下依赖:

implementation("com.louiscad.splitties:splitties-fragments:$splitties_version")

Fragment开启Activity,并以最少的样板代码进行事务。

Contextstart扩展功能利用了修饰的类型参数,使可以编写以下代码:start<AboutActivity>()。有一个可选的lambda,其中Intent是接收者,因此可以在Activity开始之前对其进行编辑(例如,添加标志)。

FragmentActivityfragmentTransaction扩展函数允许进行Fragment事务,而不必重复编写beginTransactioncommit调用。

它具有两个可选参数:

  • now,默认情况下为true,因此默认情况下可以立即获取Fragment
  • 默认为falseallowStateLoss

lambda是处理片段(例如,添加,替换...)的事务的必需主体。

FragmentTransactionaddToBackStack()扩展函数调用addToBackStack(null)。 它实际上使name参数成为可选参数。

fragmentargs库

要使用这个库添加如下依赖:

implementation("com.louiscad.splitties:splitties-fragmentargs:$splitties_version")

由于具有委派的属性,无需辩认就可以分割参数。

class YourFragment : Fragment() {

var someRequiredId: Int by arg()
var optionalArg: String? by argOrNull()
var nonNullOptionalArg: String by argOrDefault("")
var anotherNonNullOptionalArg: String by argOrElse { "splitties rock!".capitalize() }

private fun yourMethod() = yourCode()
}

fun createYourFragment(someId: Int): Fragment = YourFragment().apply {
someRequiredId = someId
}

 

lifecycle-coroutines库

要使用这个库添加如下依赖:

implementation("com.louiscad.splitties:splitties-lifecycle-coroutines:$splitties_version")

协程与生命周期的集成。

扩展属性:

名字 描述
LifecycleOwner.lifecycleScop 在Android主线程上调度并在LifecycleOwner被销毁之前一直处于活动状态的作用域。
Lifecycle.coroutineScope 在Android主线程上调度并在生命周期destory之前一直处于活动状态的作用域。
Lifecycle.job  生命周期destory时取消的job。

扩展方法:

名字 描述
Lifecycle.awaitResumed 生命周期状态resumed后立即返回/恢复的挂起函数。
Lifecycle.awaitStarted 在生命周期状态started时返回/恢复的挂起函数。
Lifecycle.awaitCreated 在生命周期状态created后立即返回/恢复的挂起函数。
Lifecycle.awaitState 一个生命周期状态为passed状态时返回/恢复的挂起函数。
Lifecycle.createJob 状态为已通过时处于活动状态的job。
Lifecycle.createScope  在Android主线程上调度并在状态为已传递状态时处于活动状态的作用域。

例如:

class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
lifecycleScope.launch {
someSuspendFunction()
someOtherSuspendFunction()
someCancellableSuspendFunction()
}
}

override fun onStart() {
super.onStart()
val startedScope = lifecycle.createScope(activeWhile = Lifecycle.State.STARTED)
startedScope.launch {
aCancellableSuspendFunction()
yetAnotherCancellableSuspendFunction()
}
startedScope.aMethodThatWillLaunchSomeCoroutines()
}
}

 

mainhandler库

要使用这个库添加如下依赖:

implementation("com.louiscad.splitties:splitties-mainhandler:$splitties_version")

顶级mainHandler属性,用于为主Looper分配多个Handler

请注意,mainHandler是异步的,这意味着没有vSync延迟。 如果需要同步处理程序,则可以简单地使用mainHandlerAsync(在此拆分中也提供)。

mainthread库

要使用这个库添加如下依赖:

implementation("com.louiscad.splitties:splitties-mainthread:$splitties_version")

Android主线程相关的属性。此库提供了一些与Android主线程和2个前提条件检查器相关的属性。

  • mainLooper:Looper.getMainLooper()的快捷方式。
  • mainThread:Looper.getMainLooper()!!.thread的快捷方式。
  • isMainThread:布尔属性,如果当前线程是主线程,则为true。
  • checkMainThread():如果未在主线程上运行,则抛出IllegalStateException。
  • checkNotMainThread():如果在主线程上运行,则抛出IllegalStateException。

material-colors库

要使用这个库添加如下依赖:

implementation("com.louiscad.splitties:splitties-material-colors:$splitties_version")

此库含2018年更改之前材料设计准则中引用的所有颜色的颜色资源(已添加材料调色板生成器)。

  • Red 500: R.color.red_500 / @color/red_500
  • Cyan accent 400: R.color.cyan_a400 / @color/cyan_a400

permissions库

要使用这个库添加如下依赖:

implementation("com.louiscad.splitties:splitties-permissions:$splitties_version")

请求运行时权限,在Android上请求运行时权限的并没有最直接方法。如果不使用任何库,所有权限请求结果都将以一种方法(必须将其从ActivityFragment中重写方法)覆盖。 这意味着要编写很多代码。Splitties Permissions利用挂起的函数和在后台的DialogFragments,使请求许可并通过单个函数调用处理所有结果情况。

顶级函数如下:

名字 描述
hasPermission 如果将传递的运行时权限被授予当前应用程序,则返回true。
requestPermission 如果需要,则请求传递的权限,并返回结果。
ensurePermission  请求传递的权限,如果需要,将用户带到设置中的应用程序详细信息,并仅在被授予时返回。

扩展函数如下:

名字 描述
Fragment.requestPermission 如果需要返回结果的请求传递的权限。
FragmentActivity.requestPermission 如果需要返回结果的请求传递的权限。
Fragment.ensurePermission 请求传递的权限,如果需要,将用户带到设置中的应用程序详细信息,并仅在被授予时返回。
FragmentActivity.ensurePermission  请求传递的权限,如果需要,将用户带到设置中的应用程序详细信息,并仅在被授予时返回。

resources库

要使用这个库添加如下依赖:

implementation("com.louiscad.splitties:splitties-resources:$splitties_version")

支持主题属性的扩展,可轻松获取字符串,颜色或可绘制对象等资源。当前,该模块的所有扩展都可用于ContextFragmentView类型。

每个应用程序都有一个前缀为应用程序的版本(例如appColor(...)),该版本可在任何地方使用,但仅使用应用程序上下文返回资源,这意味着它们将不使用当前Activity的主题。

Colors

  • color():接受颜色资源ID并返回颜色Int值
  • colorSL():接受颜色资源ID并返回ColorStateList
  • styledColor():采用颜色主题属性并返回Int
  • styledColorSL():采用颜色主题属性并返回ColorStateList
val brandPrimaryColor = color(R.color.brand_primary)
val accentColor = styledColor(R.attr.colorAccent)

 

Dimensions

  • dimen():接受资源ID,并返回其Float值
  • dimenPxSize():接受资源ID,并返回其四舍五入的Int值
  • dimenPxOffset():接受资源ID,并返回其截断的Int值

Drawables

  • drawable():接受一个可绘制资源ID并返回一个Drawable?
  • styledDrawable():采用可绘制主题属性并返回Drawable?

Primitives

  • bool():接受布尔资源ID,并返回其布尔值
  • int():接受一个整数资源ID并返回其Int值
  • intArray():接受一个整数数组资源ID并返回一个IntArray

Text

  • txt():接受字符串资源ID并返回CharSequence
  • str():接收字符串资源ID并返回一个String。 还有可选的格式参数。
  • qtyTxt():(对于复数)返回CharSequence
  • qtyStr():(对于复数)返回String。 还有可选的格式参数。
  • txtArray():获取数组资源ID,并返回Array <out CharSequence>
  • strArray():接受数组资源ID并返回Array <String>
  • styledTxt():采用字符串主题属性并返回CharSequence?
  • styledStr():采用字符串主题属性并返回String? 还有可选的格式参数。
  • styledTxtArray():具有数组主题属性,并返回Array <out CharSequence>?

systemservices库

要使用这个库添加如下依赖:

implementation("com.louiscad.splitties:splitties-systemservices:$splitties_version")

不再需要context.getSystemService(NAME_OF_SERVICE)as NameOfManager。该库包含自API 27起的所有Android系统服务。它允许使用简单的属性访问它们。

大多数系统服务使用应用程序上下文,并且可以在应用程序代码中的任何位置使用,但是某些可能因上下文而异的内容(例如LayoutInflaterWindowManager)是ContextViewAccessibilityService的扩展。

//之前
fun performSomeVibration(vibe: VibrationEffect) {
 val vibrator = context.getSystemService(VIBRATOR_SERVICE) as Vibrator
 vibrator.vibrate(vibe)
}
//现在
fun performSomeVibration(vibe: VibrationEffect) {
 vibrator.vibrate(vibe)
}

 

toast库

要使用这个库添加如下依赖:

implementation("com.louiscad.splitties:splitties-toast:$splitties_version")

只需调用toast(yourText)即可显示,并避开API 25 BadTokenException

要创建和显示Toast,只需使用字符串资源ID或CharSequence调用toast(…)或longToast(…)即可。

view库

要使用这个库添加如下依赖:

implementation("com.louiscad.splitties:splitties-views:$splitties_version")

View上的扩展函数和属性。

此库包括View相关类的扩展。 以编程方式处理View时,它们将会很有用。

依赖于AndroidX KTX

Android KTX已将其有用的View扩展捆绑在一起。 例如,它包括View可见性扩展属性,例如isVisible。 为避免重复,Splitties弃用了Android KTX使其成为多余的,并转而包含了依赖项。

View background属性

bgViewbackground属性的别名,但可以在API 16以下使用setBackgroundDrawable()`来工作。

backgroundColor允许使用属性语法设置View的背景颜色。

ImageView属性

imageResource允许使用属性语法从资源ID设置ImageView的图像。

imageDrawable是否允许使用Drawable获取,设置或清除ImageViewDrawable? 使用属性语法。

imageBitmap允许使用属性语法从BitMap设置ImageView的图像。

Layout方向属性

ViewisLtr扩展属性在API 16及更低版本或布局方向从左到右时为true

isRtl是!isLtr。 在使用阿拉伯语或另一种RTL语言的API 17+设备设置上,或者在开发人员选项中将设备强制为RTL时,将为true

View padding属性

以下扩展属性允许使用属性语法设置View的填充:

padding
horizontalPadding
verticalPadding
topPadding
bottomPadding

 

TextView扩展

textResource允许使用属性语法从字符串资源ID设置TextView的文本。

textColorResource允许使用属性语法从颜色资源ID设置TextView文本的颜色。

textAppearance允许使用属性语法(甚至低于API 23)从文本外观样式资源ID设置TextView的文本外观。

lines允许使用属性语法设置TextView的确切行数。

centerText()将重力设置为中心,并使文本居中对齐。 alignTextToStart()将重力设置为开始并开始对齐文本。 alignTextToEnd()将重力设置为end,然后end对齐文本。

setCompoundDrawables(…)需要Drawable?开始,顶部,结束和底部的参数(均默认为null)以及一个默认为falseinternalBounds参数。

setCompoundDrawables()有一个重载,该重载采用默认为0(无可绘制)的可绘制资源ID,但没有internalBounds参数(因为它隐式为true)。

clearCompoundDrawables()清除TextView具有的所有复合可绘制对象。

Gravity标志别名

Android上使用Gravity常量有点冗长。 为缓解此小问题,此拆分为View提供了从重力开始的扩展属性。 它们涵盖了大多数用例,并且可以很好地发挥自动完成功能。

gravityCenter
gravityCenterVertical
gravityCenterHorizontal
gravityVerticalCenter
gravityHorizontalCenter
gravityStart
gravityTop
gravityEnd
gravityBottom
gravityStartBottom
gravityStartTop
gravityEndBottom
gravityEndTop
gravityBottomStart (alias to gravityStartBottom)
gravityTopStart (alias to gravityStartTop)
gravityBottomEnd (alias to gravityEndBottom)
gravityTopEnd (alias to gravityEndTop)
gravityStartCenter
gravityEndCenter
gravityTopCenter
gravityBottomCenter

使用所有基础库

如果想使用上面所有的基础库可以添加如下依赖:

implementation("com.louiscad.splitties:splitties-fun-pack-android-base:$splitties_version")
点赞

发表评论

昵称和uid可以选填一个,填邮箱必填(留言回复后将会发邮件给你)
tips:输入uid可以快速获得你的昵称和头像

Title - Artist
0:00