【问题标题】:How to assign string resource to kotlin value without getting error如何将字符串资源分配给 kotlin 值而不会出错
【发布时间】:2019-06-21 20:58:40
【问题描述】:

我的代码中有价值:

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”?

【问题讨论】:

    标签: android xml kotlin


    【解决方案1】:

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

    this.resources
    

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

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

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

    【讨论】:

      【解决方案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
        }
      }
      

      【讨论】:

        【解决方案3】:

        resources() 是 Context 类的方法。如果您在 Activity 或 Service(扩展 Context)中,则可以像在这个 sn-p 中一样使用它。

        还要注意整个语言依赖可以由 android 框架来处理。只需为每种语言创建不同的文件夹。如果英语是您的默认语言,只需将英语字符串放入 res/values/strings.xml。然后新建一个文件夹values-ru,将同名的俄语字符串放入res/values-ru/strings.xml。从这一点开始,android 会根据您的设备区域设置选择正确的,无论是在您调用 getString() 时,还是在通过 @string/mystring 引用 XML 中的字符串时。 res/values/strings.xml 中的那些是后备的,如果您没有覆盖用户区域设置的文件夹,则该文件夹将用作默认值。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-04-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-09-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多