Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/196.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从Kotlin中的静态上下文访问Android应用程序资源(li.e.字符串)?_Android_Kotlin - Fatal编程技术网

如何从Kotlin中的静态上下文访问Android应用程序资源(li.e.字符串)?

如何从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 }

我想从没有上下文的源文件中的xml文件中读取字符串。理想情况下,我想这样做:


但是我不知道如何将其转换为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;