Lokalise.co库如何覆盖TextView的text属性

时间:2019-04-30 19:47:04

标签: android android-resources

我正在尝试编写自己的本地化库。 我试图弄清楚如何覆盖所有对字符串资产的调用。

我发现我可以拥有一个像ContextWrapper这样的东西:

class MyConextWrapper(context: Context?) : ContextWrapper(context) {
private val _baseResources = context?.resources
private var customResources : Resources? = null

override fun getResources(): Resources {
    if (customResources == null) {
        customResources = MyRes(_baseResources?.assets, _baseResources?.displayMetrics, _baseResources?.configuration)
    }
    return customResources!!
}


}

class MyRes : Resources {
constructor(assets: AssetManager?, metrics: DisplayMetrics?, config: Configuration?) : super(assets, metrics, config)

override fun getString(id: Int): String {
    return super.getString(id)
}

override fun getString(id: Int, vararg formatArgs: Any?): String {
    return super.getString(id, *formatArgs)
}

override fun getText(id: Int): CharSequence {
    return super.getText(id)
}

override fun getText(id: Int, def: CharSequence?): CharSequence {
    return super.getText(id, def)
}
}

然后在我的活动中覆盖

override fun attachBaseContext(newBase: Context?) {
    super.attachBaseContext(MyConextWrapper(newBase))
}

现在所有对getString(R.String。*)的调用都将通过我的代码

但是如何无缝覆盖

<TextView
        android:id="@+id/headlineTextView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/string_id"/>

如何覆盖此string_id资产中的字符串?

调试TextView的工作方式时,我看到它从TypedArray获取字符串,而字符串又直接从assetManager获取字符串,并且该类是最终的,因此我无法在ContextWrapper中覆盖它。

我的问题是我该如何像https://lokalise.co/所说的那样修改这种行为

1 个答案:

答案 0 :(得分:-1)

重写getString函数以执行所需的任何操作。他们的代码将调用getString,传入他们想要的字符串的ID。然后,您可以返回所需的任何字符串。