当前位置: 首页 > 知识库问答 >
问题:

Kotlin Android Extensions替换findViewById如何防止空视图?

葛烨
2023-03-14

我知道Kotlin的Android扩展创建了合成属性+缓存功能,以取代调用findviewbyid:

  • https://stackoverflow.com/a/46482618/1650674
  • https://www.raywenderlich.com/84-kotlin-android-extensions
  • https://antonioleiva.com/kotlin-android-extensions/

所有这些示例都表明类似的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();
   }
}
<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?

共有1个答案

金秦斩
2023-03-14

我不明白的是这是如何防止潜在的NPE的?

它没有。如果尝试引用不存在的小部件,则会崩溃。

只要import语句只针对Kotlin代码的相关布局,就不应该引用不存在的小部件。问题是,如果您意外地从另一个布局导入合成属性。

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
  }
}
 Caused by: java.lang.IllegalStateException: scrapView must not be null
    at com.commonsware.android.myapplication.MainActivity.onCreate(MainActivity.kt:14)
 类似资料:
  • 我试图将每个列表都位于嵌套对象内的webservice模型映射到更简单的对象。 模型1 映射非常简单: 映射工作正常,除了一个问题。当我将带有null子级的父母映射到父母2并返回父母时,儿童对象是用空列表创建的。有什么方法可以防止这种情况吗?

  • 我查阅了关于单元素元组的文档,对它如何防止空间泄漏有点困惑,这让我怀疑我对Haskell内存模型和/或垃圾收集器的工作原理一无所知。 引用文件,他们说: Solo最重要的特性是可以强制其“外部”(通常通过模式匹配)而不强制其“内部”,因为它被定义为数据类型而不是新类型。在编写函数以从数据结构中提取值时,这可能很有用。假设您编写了数组的一个实现,并且只提供此函数来索引数组: 这实际上会导致空间泄漏。

  • 问题内容: 在python中,如果我说 我收到字母h和换行符。如果我说 我收到字母h,没有换行符。如果我说 我得到字母h,一个空格和字母。如何防止Python打印空间? 打印语句是同一循环的不同迭代,因此我不能只使用运算符。 问题答案: 你需要致电,因为否则它将把文本保存在缓冲区中,你将看不到它。

  • 假设我们想用它的摩尔斯码替换字母“a”,从text.txt文件到使用sed的隐藏的.out.txt文件,原始文件的内容是“这是一个测试”。 正如预期的那样,输出是“this is.-test”。 但是,假设我们希望执行sed的多个实例,而不需要使用-n参数不断打印sed的每个实例的结果。在这种情况下: 然而,在这种情况下,cat的输出与text.txt的内容相同,“这是一个测试”。 是否有一种可能

  • 问题内容: 我需要从OracleSQL中的employees表中显示Employee及其佣金金额,但是条件是如果它遇到值,我需要打印_“ No Commission”_ 。 在第一部分中,我写道: 但是我无法获得如何用 “ No Commission” 代替价值观。 问题答案: 您可以使用表达式: 或: 或: PS如果不是数据类型,则也应使用或。

  • 问题内容: 请看下面的简化示例: 这打印出来,但我希望所选的html部分照原样打印:。我如何告诉jsoup不要转换’<’符号? 问题答案: 可以使用jsoup。 使用jSoup 1.8.3,可以使用保留原始html的Parser.unescapeEntities方法。 在某些以前的版本中,不存在此方法。 从此链接了解更多信息。