我在代码中具有价值:
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”?
答案 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中的是后备版本,如果您没有覆盖用户区域设置的文件夹,则该文件夹将用作默认值。