2014-03-29 60 views
3

有沒有辦法攔截XML資源(菜單和佈局)來改變它使用的字符串(例如,對於像android:text="@string/button_trade_commit"屬性。)有沒有一種方法來覆蓋android框架膨脹資源的getString()?

我知道這是可以覆蓋getString(),因爲它是從一個叫做Android框架的通脹活動。但框架代碼似乎並沒有使用getString()。例如,在MenuInflator.java中,字符串來自mContext.obtainStyledAttributes(),而obtainStyledAttributes()是最終的:我無法覆蓋它。

有人知道另一種方法來完成這個嗎?

背景:我想讓非英語的用戶自己本地化我的應用。我想象一個接口,它顯示英文字符串,並讓他們輸入一個翻譯,然後用英文字符串代替。我可以想象,還可以提供一個「分享翻譯」按鈕,用於上傳翻譯,然後在服務器端將其合併到可供其他相同語言用戶使用的可下載模塊中。能夠在運行時替換字符串是我無法弄清楚的阻塞塊。

回答

1

我不相信你可以覆蓋系統getString()方法你看它的方式。
這可能是值得嘗試使用自定義屬性和處理那裏的工作:我不認爲你將能夠修改過程中膨脹的資源,當你想要的方式來Android使用http://developer.android.com/training/custom-views/create-view.html#customattr

+0

這對於佈局資源非常有效:我可以將子類的子類像Button一樣,並根據自定義屬性提供自己的字符串。菜單更成問題,因爲您永遠無法訪問AttributeSet:自定義屬性無用。所以我要嘗試的是用一個字符串(而不是引用)替換每個菜單的標題,並在onCreateOptionsMenu()中使用該字符串作爲實際字符串的關鍵字(以替換menuitem的標題)將在構建時從R.java構建鍵 - >字符串映射,所以不應該存在需要維護的附加映射。 – user496795

+0

事實證明,在Android框架中存在太多不一致的地方,以便爲此提供單個/通用修補程序。我試着在構建時重寫我的.xml文件,用_loc:string_name替換@ string/string_name,然後在運行時漫遊充氣視圖並替換以_loc:開頭的字符串。但是一些資源元素,例如微調的提示,必須給予參考。如果它把代碼變成意大利麪,這不值得做,但這似乎是我前進的方式。 – user496795

0

你可以做的是不要在XML文件中提供任何字符串(android:text等)。您始終可以獲得對代碼中XML文件中任何元素的引用。一旦你有了一個參考,你可以在代碼中提供文本,從你的定製框架中獲取正確的本地化字符串。

0

我不確定這件事,但我認爲你可以檢查Android的Calligraphy庫的來源。它重寫系統LayoutInflater來更改FontType,所以我想你可以做同樣的改變字符串。

相關問題