我正在开发一个带有片段的应用程序,我想使用MainActivity.kt中“strings.xml”的值。这些是选项卡的名称。但是,如果我这样做:
private var title: String = getText(R.string.title).toString()
当我运行代码时,我得到这个错误:
java.lang.NullPointerException:尝试对空对象引用调用虚拟方法“android.content.res.Resources android.content.Context.getResources()”
如果我这样做:
private var title = getText(R.string.title)
我也会得到错误,如果我这样做:
private var title = R.string.title
我得到了一个整数。我怎样才能得到<string name="title">Start</string>
中的自然文本呢?
2条答案
按热度按时间dz6r00yl1#
在
Activities
和Fragments
中,你需要小心地给需要Context
的表达式分配顶级变量。它们在构造时没有Context
,系统稍后会提供--这就是为什么你最终会看到这种错误(在您的示例中,它试图在应该是Context
的对象上调用getResources()
,但实际上是 null)。片段的
Context
在它进入CREATED状态时已经被附加了,所以在onCreate
或更高版本中访问它是安全的,所以你可以创建你的顶层变量lateinit
(延迟赋值),并在以后设置它的值:或者你可以使用
lazy
委托,它会在第一次访问变量时通过运行setter函数来设置值:如果函数在
Context
可用之前被调用,那么这个方法就会失败,所以在这两种情况下,你都必须保证不会有任何东西过早地试图从Context
中读取。lazy
可以说更简洁(没有单独的赋值),但是它确实使值变成了只读的,而不是var
--在这种情况下可能没问题!另外,如果您特别需要
String
而不是CharSequence
,只需调用getString
而不是getText
mf98qq942#
您应该使用getString(),并且getString函数(以及getText)需要示例化您的Activity。