我正在尝试编写自己的本地化库。 我试图弄清楚如何覆盖所有对字符串资产的调用。
我发现我可以拥有一个像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/所说的那样修改这种行为
答案 0 :(得分:-1)
重写getString函数以执行所需的任何操作。他们的代码将调用getString,传入他们想要的字符串的ID。然后,您可以返回所需的任何字符串。