android 使用片段时,如何从主Activity类的资源文件中获取值?

lstz6jyr  于 2023-03-11  发布在  Android
关注(0)|答案(2)|浏览(130)

我正在开发一个带有片段的应用程序,我想使用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>中的自然文本呢?

dz6r00yl

dz6r00yl1#

ActivitiesFragments中,你需要小心地给需要Context的表达式分配顶级变量。它们在构造时没有Context,系统稍后会提供--这就是为什么你最终会看到这种错误(在您的示例中,它试图在应该是Context的对象上调用getResources(),但实际上是 null)。
片段的Context在它进入CREATED状态时已经被附加了,所以在onCreate或更高版本中访问它是安全的,所以你可以创建你的顶层变量lateinit(延迟赋值),并在以后设置它的值:

// define the variable without a value - you need to set a value before this is read!
private lateinit var title: String

override fun onCreate(savedInstanceState: Bundle?) {
    ...
    // assign the value when you can
    title = getText(R.string.title).toString()
}

或者你可以使用lazy委托,它会在第一次访问变量时通过运行setter函数来设置值:

private val title: String by lazy {
    getText(R.string.title).toString()
}

如果函数在Context可用之前被调用,那么这个方法就会失败,所以在这两种情况下,你都必须保证不会有任何东西过早地试图从Context中读取。lazy可以说更简洁(没有单独的赋值),但是它确实使值变成了只读的,而不是var--在这种情况下可能没问题!
另外,如果您特别需要String而不是CharSequence,只需调用getString而不是getText

mf98qq94

mf98qq942#

您应该使用getString(),并且getString函数(以及getText)需要示例化您的Activity。

override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        var title = getString(R.string.title)

相关问题