如何将字符串资源分配给kotlin值而不会出现错误

时间:2019-06-21 20:58:40

标签: android xml kotlin

我在代码中具有价值:

val mainFileName = "Untitled list"

我知道处理字符串的最佳方法是使用字符串资源,因此在字符串资源文件中我创建了以下字符串:

<string name="untitled_list">Untitled list</string>

为了测试我是否做得正确,我在烤面包上测试了该字符串,并且一切正常:

Toast.makeText(this, R.string.untitled_list,Toast.LENGTH_SHORT).show()

然后我尝试通过执行以下操作(在MainActivity类内部,但在方法OnCreate之外)为该字符串资源分配“ mainFileName”:

val previewOfNewListTitle = resources.getString(R.string.untitled_list)

但是我得到一个错误:

     Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.res.Resources android.content.Context.getResources()' on a null object reference
    at android.content.ContextWrapper.getResources(ContextWrapper.java:91)
    at android.view.ContextThemeWrapper.getResourcesInternal(ContextThemeWrapper.java:127)
    at android.view.ContextThemeWrapper.getResources(ContextThemeWrapper.java:121)
    at android.support.v7.app.AppCompatActivity.getResources(AppCompatActivity.java:543)
    at lt.tetro.myapplication.MainActivity.<init>(MainActivity.kt:121)

如何在MainActivity类内部将字符串资源文本分配给“ mainFileName”?

3 个答案:

答案 0 :(得分:2)

  

然后我尝试通过执行以下操作(在MainActivity类内部,但在方法OnCreate之外)为该字符串资源分配“ mainFileName”:

您必须等到super.onCreate()之后,才能尝试使用从Activity继承的大多数方法,包括getString()

  

如何在MainActivity类内部将字符串资源文本分配给“ mainFileName”?

使用lateinit var

class SomethingActivity : AppCompatActivity() {
  private lateinit var mainFileName: String

  override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    mainFileName = getString(R.string.untitled_list)

    // TODO rest of your activity here
  }
}

答案 1 :(得分:2)

resources需要一个有效的Context(尽管您可以在活动类中将其省略),例如:

this.resources

super.onCreate()完成之前不存在。
因此,每次尝试使用它都会导致错误。
您可以做的是使用函数lazy声明变量,如下所示:

val previewOfNewListTitle: String by lazy { resources.getString(R.string.untitled_list) }

这是有效的,因为在您第一次在代码中使用变量之前,它不会初始化变量。

答案 2 :(得分:0)

resources()是Context类的方法。如果您在Activity或Service(扩展了Context)中,则可以在此代码段中使用它。

还要注意,整个语言依赖关系可以由android框架解决。只需为每种语言创建不同的文件夹。如果英语是您的默认语言,只需将英语字符串放入res / values / strings.xml中。然后创建一个新文件夹values-ru,并将具有相同名称的俄语字符串放入res / values-ru / strings.xml中。从这一点上,当您调用getString()或通过@ string / mystring引用XML中的字符串时,android会根据设备的语言环境为您选择正确的字符串。 res / values / strings.xml中的是后备版本,如果您没有覆盖用户区域设置的文件夹,则该文件夹将用作默认值。