如何从Kotlin中的静态上下文访问Android应用程序资源(li.e.字符串)?
我想从没有上下文的源文件中的xml文件中读取字符串。理想情况下,我想这样做:如何从Kotlin中的静态上下文访问Android应用程序资源(li.e.字符串)?,android,kotlin,Android,Kotlin,我想从没有上下文的源文件中的xml文件中读取字符串。理想情况下,我想这样做: 但是我不知道如何将其转换为Kotlin。基本上是一样的。Kotlin与Java没有太大区别。事实上,在Android Studio中将Java代码粘贴到Kotlin文件中会出现提示,询问您是否要转换该代码 无论如何: 应用程序类: class App : Application() { companion object { var context: Context? = null }
但是我不知道如何将其转换为Kotlin。基本上是一样的。Kotlin与Java没有太大区别。事实上,在Android Studio中将Java代码粘贴到Kotlin文件中会出现提示,询问您是否要转换该代码 无论如何: 应用程序类:
class App : Application() {
companion object {
var context: Context? = null
}
override fun onCreate() {
super.onCreate()
context = this;
}
}
然后,从任何其他类别:
val context = App.context
val someString = context?.resources.getString(R.string.some_string) //context is nullable so "?" is needed
记得加上
android:name=".App"
到AndroidManifest中的应用程序标记。如果应用程序不在包的根目录中,则需要更改该值以反映其所在位置
如果您需要从Java访问它:
App.COMPANION.getContext();
Android Studio可能会抱怨上下文泄漏。然而,这不应该是准确的,因为只要你的应用程序在运行,应用程序上下文就会在那里,一旦你的应用程序被终止或停止,甚至连一个运行中的JVM都不会泄漏。这基本上是一样的。Kotlin与Java没有太大区别。事实上,在Android Studio中将Java代码粘贴到Kotlin文件中会出现提示,询问您是否要转换该代码 无论如何: 应用程序类:
class App : Application() {
companion object {
var context: Context? = null
}
override fun onCreate() {
super.onCreate()
context = this;
}
}
然后,从任何其他类别:
val context = App.context
val someString = context?.resources.getString(R.string.some_string) //context is nullable so "?" is needed
记得加上
android:name=".App"
到AndroidManifest中的应用程序标记。如果应用程序不在包的根目录中,则需要更改该值以反映其所在位置
如果您需要从Java访问它:
App.COMPANION.getContext();
Android Studio可能会抱怨上下文泄漏。然而,这不应该是准确的,因为只要你的应用程序在运行,应用程序上下文就会在那里,一旦你的应用程序被终止或停止,甚至连一个运行中的JVM都不会发生泄漏。你永远不应该让上下文成为静态的。这是一种不好的做法,可能会导致内存泄漏和其他问题 顺便说一句,Kotlin中的static被同伴对象替换。所以你的代码可能是这样的。同样,不要存储上下文
class MyApplication: Application {
override fun onCreate() {
super.onCreate()
sContext = this
}
companion object {
var sContext: Context? = null
}
}
但更好的方法是存储您想要的静态资源,而不是上下文。您不应该将上下文设置为静态。这是一种不好的做法,可能会导致内存泄漏和其他问题 顺便说一句,Kotlin中的static被同伴对象替换。所以你的代码可能是这样的。同样,不要存储上下文
class MyApplication: Application {
override fun onCreate() {
super.onCreate()
sContext = this
}
companion object {
var sContext: Context? = null
}
}
但更好的方法是存储所需的静态资源,而不是上下文。我认为应用程序上下文不会泄漏。活动和服务上下文可以,因为它们是短期组件,但一旦应用程序关闭,甚至没有JVM为其运行,因此上下文会被取消设置,并随着关闭的JVM一起清空内存。我不清楚上下文作者在问什么。所以我还是要警告他。你肯定知道,因为你是从应用程序分配的,这是应用程序上下文。我提供了一个更好的应用程序上下文示例。作者可能会有所不同。存储应用程序上下文很好。我认为应用程序上下文不会泄漏。活动和服务上下文可以,因为它们是短期组件,但一旦应用程序关闭,甚至没有JVM为其运行,因此上下文会被取消设置,并随着关闭的JVM一起清空内存。我不清楚上下文作者在问什么。所以我还是要警告他。你肯定知道,因为你是从应用程序分配的,这是应用程序上下文。我提供了一个更好的应用程序上下文示例。作者可能会有不同的做法。存储应用程序上下文很好。最好将上下文作为参数传递:最好将上下文作为参数传递:如果您使用@JvmStatic注释标记上下文,那么从java将有一个类似的调用App.getContext;如果您使用@JvmStatic注释标记上下文,那么从java将有一个类似的调用App.getContext;