Android在Kotlin中的16个开发技巧。 第三部分

你好! 预期将推出有关Android开发基础课程 ,因此我们分享了文章“用Kotlin语言编写的16个android开发技巧”的最后部分。




阅读第一部分
阅读第二部分

拉丁语


Kotlin的主要功能之一是对零安全性的承诺。 lateinit语句提供了一种确保Android零安全并初始化变量的简便方法。 这个功能很棒,但是,在使用Java之后,您应该习惯它。 一种想法是立即声明该字段为空:

var total = 0 var toolbar: Toolbar? = null 


使用Android布局时,此语言功能可能会造成困难,因为我们不知道如何在声明布局之前声明视图,因为尚不清楚它们在ActivityFragment 。 这可以通过额外的测试来弥补,因为我们在与之交互的每个位置都将零值设为零,但这仍然是痔疮。 因此,最好使用lateinit修饰符:

 lateinit var toolbar: Toolbar 

现在,作为开发人员,在实际对其进行初始化之前,您不应该引用它。 与黄油刀之类的库配合使用时,效果很好:

 @BindView(R.id.toolbar) lateinit var toolbar: Toolbar override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) ButterKnife.bind(this) //       toolbar toolbar.setTitle("Hello There") } 

类型安全


某些Android约定要求安全键入,因为常规键入不会排除代码错误。 例如,创建片段的典型方法是通过FragmentManager进行检查以确保它已经存在。 并且只有在不是的情况下,您才能创建它并将其添加到操作中。 当您第一次查看在Kotlin中键入内容时,可以按以下方式实现:

 var feedFragment: FeedFragment? = supportFragmentManager .findFragmentByTag(TAG_FEED_FRAGMENT) as FeedFragment      .  as     ,     .   : var feedFragment: FeedFragment? = supportFragmentManager .findFragmentByTag(TAG_FEED_FRAGMENT) as? FeedFragment if (feedFragment == null) { feedFragment = FeedFragment.newInstance() supportFragmentManager.beginTransaction() .replace(R.id.root_fragment, feedFragment, TAG_FEED_FRAGMENT) .commit() } 

杠杆让


利用杠杆作用,如果对象的值非零,则可以执行块。 这样可以避免进行空检查,并使代码更具可读性。 在Java中,它看起来像这样:

 if (currentUser != null) { text.setText(currentUser.name) }   Kotlin   : user?.let { println(it.name) } 

该代码更具可读性,而且它会自动创建一个具有非零值的变量,而不会将其归零。

SNULLOREMPTY | ISNULLORBLANK


在Android应用程序的开发过程中,我们必须多次检查这些字段。 如果您在不使用Kotlin的情况下进行管理,则可能知道Android中的TextUtils类。 TextUtils类如下:

 if (TextUtils.isEmpty(name)) { //    } 

在此示例中,您会注意到用户甚至可以将空格设置为用户名,他将通过测试。 isNullOrEmptyisNullOrBlank内置于Kotlin语言中,消除了对TextUtils.isEmptysomeString )的需求,并提供了仅检查空格的额外好处。 如有必要,可以使用以下方法:

 //       ... if (number.isNullOrEmpty()) { //     } //  ... if (name.isNullOrBlank()) { //     } 

当需要在应用程序中注册时,通常会发现检查字段填写的正确性。 这些内置方法非常适合检查字段并在出现问题时提醒用户。 对于更复杂的检查,您可以对电子邮件地址使用扩展方法,例如:

 fun TextInputLayout.isValidForEmail(): Boolean { val input = editText?.text.toString() if (input.isNullOrBlank()) { error = resources.getString(R.string.required) return false } else if (emailPattern.matcher(input).matches()) { error = resources.getString(R.string.invalid_email) return false } else { error = null return true } } 

进阶技巧


您是否知道可以使用lambda表达式创建更简洁明了的代码?

例如,使用Java时,通常有一个简单的侦听器类,例如:

 public interface OnClickListener { void onClick(View v); } 

Kotlin的一个独特功能是它对Java类执行SAM(单一抽象方法)转换。 Java中的单击侦听器,如下所示:

 textView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { // -  } });  Kotlin     : textView.setOnClickListener { view -> // -  } 

奇怪的是,对于在Kotlin中创建的SAM接口,这种转换是不可能的。 这可能会令人惊讶,甚至会使新的Kotlin用户失望。 如果在Kotlin中定义了相同的接口,则侦听器将如下所示:

 view.setOnClickListener(object : OnClickListener { override fun onClick(v: View?) { // -  } }) 

为了缩短这样的代码,您可以按以下方式将您的侦听器写入该类:

 private var onClickListener: ((View) -> Unit)? = null fun setOnClickListener(listener: (view: View) -> Unit) { onClickListener = listener } //     onClickListener?.invoke(this) 

这将使您返回一个简单的lambda语法,从而可以进行自动SAM转换。

结论


自从对Kotlin语言感兴趣以来,我从所学的一切中收集了最有用的生活技巧。 我希望了解这些技巧将对您开发自己的项目有很大帮助。

仅此而已。 在课程中见!

Source: https://habr.com/ru/post/zh-CN481010/


All Articles