Android:如何在Kotlin中将string.xml中的R.string值设置为全局常量?

问题描述 投票:1回答:2

我不是Kotlin的新手,所以也许我缺少明显的东西,但是我无法通过Google找到答案。

如何将Kotlin常数的值设置为strings.xml资源值?我已经尝试过像下面这样,但是会引发以下错误:

由于:java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法'android.content.res.Resources android.content.Context.getResources()'

这是我的代码,第一个val声明失败:

class MainActivity: AppCompatActivity() {

        private val STATUS_PREP = getString(R.string.status_prep) //THIS LINE FAILS
        private val STATUS_FIGHT = "fight" //res.getString(R.string.status_fight)
        private val STATUS_REST = "rest" //res.getString(R.string.status_rest)
        private val STATUS_COMPLETE = "complete" //res.getString(R.string.status_complete)
        private val STATUS_PAUSED = "paused" //res.getString(R.string.status_paused)
android xml string kotlin constants
2个回答
2
投票

改为执行此操作。

class MainActivity : AppCompatActivity() {

    private STATUS_PREP_2: String by lazy {
        getString(R.string.status_prep_2) 
    }

    private lateint var STATUS_PREP: String

    override fun onCreate(savedInstanceState: Bundle?) {
        // snip
        initString()
    }

    private fun initString() {
        STATUS_PREP = getString(R.string.status_prep) 
        // Init all your string here
    }
}

您将收到异常,因为在创建活动实例后未立即初始化context


-2
投票

您可以创建一个继承Application类的类,并在其中创建静态字段,该字段将保持对应用程序上下文的引用,如下所示:

class MyApplication: Application() {
    companion object {
         var context: Context? = null
    }

     override fun onCreate() {
        super.onCreate()
        context = applicationContext
     }
}

在此之后,将其名称放在AndroidManifest.xml中,如下所示:

<application
    android:name="com.yourpackage.MyApplication"
    ...
    // many other tags>
<application>

然后您可以像下面这样简单地在应用程序的任何地方使用它:

class MainActivity : AppCompatActivity() {
     private val STATUS_PREP = MyApplication.context!!.getString(R.string.status_prep)
}
© www.soinside.com 2019 - 2024. All rights reserved.