有沒有辦法攔截XML資源(菜單和佈局)來改變它使用的字符串(例如,對於像android:text="@string/button_trade_commit"
屬性。)有沒有一種方法來覆蓋android框架膨脹資源的getString()?
我知道這是可以覆蓋getString()
,因爲它是從一個叫做Android框架的通脹活動。但框架代碼似乎並沒有使用getString()
。例如,在MenuInflator.java中,字符串來自mContext.obtainStyledAttributes()
,而obtainStyledAttributes()
是最終的:我無法覆蓋它。
有人知道另一種方法來完成這個嗎?
背景:我想讓非英語的用戶自己本地化我的應用。我想象一個接口,它顯示英文字符串,並讓他們輸入一個翻譯,然後用英文字符串代替。我可以想象,還可以提供一個「分享翻譯」按鈕,用於上傳翻譯,然後在服務器端將其合併到可供其他相同語言用戶使用的可下載模塊中。能夠在運行時替換字符串是我無法弄清楚的阻塞塊。
這對於佈局資源非常有效:我可以將子類的子類像Button一樣,並根據自定義屬性提供自己的字符串。菜單更成問題,因爲您永遠無法訪問AttributeSet:自定義屬性無用。所以我要嘗試的是用一個字符串(而不是引用)替換每個菜單的標題,並在onCreateOptionsMenu()中使用該字符串作爲實際字符串的關鍵字(以替換menuitem的標題)將在構建時從R.java構建鍵 - >字符串映射,所以不應該存在需要維護的附加映射。 – user496795
事實證明,在Android框架中存在太多不一致的地方,以便爲此提供單個/通用修補程序。我試着在構建時重寫我的.xml文件,用_loc:string_name替換@ string/string_name,然後在運行時漫遊充氣視圖並替換以_loc:開頭的字符串。但是一些資源元素,例如微調的提示,必須給予參考。如果它把代碼變成意大利麪,這不值得做,但這似乎是我前進的方式。 – user496795