gpt4 book ai didi

android - 替代 findViewById 的 Kotlin Android 扩展如何防止空 View ?

转载 作者:行者123 更新时间:2023-11-29 16:29:24 26 4
gpt4 key购买 nike

我知道 Kotlin 的 Android Extensions 创建合成属性 + 缓存函数来替换调用 findViewById 的任何需要:

所有这些示例都表明类似的 java 代码看起来像

private HashMap _$_findViewCache;
...
public View _$_findCachedViewById(int var1) {
if(this._$_findViewCache == null) {
this._$_findViewCache = new HashMap();
}

View var2 = (View)this._$_findViewCache.get(Integer.valueOf(var1));
if(var2 == null) {
var2 = this.findViewById(var1);
this._$_findViewCache.put(Integer.valueOf(var1), var2);
}

return var2;
}

public void _$_clearFindViewByIdCache() {
if(this._$_findViewCache != null) {
this._$_findViewCache.clear();
}
}

我不明白的是这如何防止潜在的 NPE? var2 = this.findViewById(var1); 可能仍会返回 null。

使用最后一个链接中的示例:

<TextView
android:id="@+id/welcomeMessage"
...
android:text="Hello World!"/>

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)

welcomeMessage.text = "Hello Kotlin!"
}

welcomeMessage 是什么类型? TextView 还是 TextView?

最佳答案

What I don't understand is how this prevents potential NPEs?

事实并非如此。如果您尝试引用一个不存在的小部件,则会崩溃。

只要您的 import 语句仅用于您的 Kotlin 代码的相关布局,您就不应该引用一个不存在的小部件。如果您不小心从另一个布局导入了合成属性,就会出现问题。

例如,假设您有一个包含 activity_main.xmlscrap.xml 布局的项目,并且您的 Activity 是:

package com.commonsware.android.myapplication

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.view.View
import kotlinx.android.synthetic.main.scrap.*

class MainActivity : AppCompatActivity() {

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)

scrapView.visibility = View.GONE
}
}

在这里,我们在 scrap 布局中引用了一个 scrapView View 。我们没有膨胀那个布局,所以这会因 IllegalStateException 而崩溃:

 Caused by: java.lang.IllegalStateException: scrapView must not be null
at com.commonsware.android.myapplication.MainActivity.onCreate(MainActivity.kt:14)

What type is welcomeMessage? TextView or TextView?

从技术上讲,它是 TextView!,其中 ! 表示“它是一种平台类型,所以我们不知道它是否可以为 null 或不”。实际上,TextView!TextView 的用法相同,这就是为什么当它最终为 null 时会崩溃。

关于android - 替代 findViewById 的 Kotlin Android 扩展如何防止空 View ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57560245/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com