Android UI中英文自動顯示問題

最近作了一個項目,其中有個視頻和圖片須要添加各類水印(日期,地點,經緯度,用戶ID,產品ID等)問題,並且水印還要支持中英文自動切換顯示。功能設計和實現算是比較順利。昨天測試部給了一個小Bug,那就是在英文環境下,視頻預覽界面水印能正常顯示英文,但經過拍照所得到的圖片上的水印卻顯示爲中文!而添加水印這一塊代碼是徹底同樣的啊?問題出在哪呢?android

通過反覆測試,沒有發現代碼有明顯問題。因而憑直覺,就想難道是context上下文不一樣有關?因而檢查代碼發現context確實不一樣,在Activity View下的Context下,水印英文是能夠自動切換過去的,而在Application的Context下水印只能顯示中文!那麼這兩個context究竟有何不一樣呢?app

這是兩種不一樣的context:
1.  Application context的生命週期與Application的 生命週期相關的,context隨着Application的銷燬而銷燬,伴隨application的一輩子,與activity的生命週期無關.
2. Activity中的context跟Activity的 生命週期是相關的,可是對一個Application來講,Activity能夠銷燬幾回,那麼屬於Activity的context就會銷燬屢次.
3. 能夠經過Activity的context得到Application context,能夠經過Context.getApplicationContext 或者 Activity.getApplication方法獲取。
 
因爲context引發內存泄漏的常見場景:
1.  錯誤的單例模式
2. View持有Activity引用

注意事項:使用context的時候,當心內存泄露,防止內存泄露!
1. 不要讓生命週期長的對象引用activity context,即保證引用activity的對象要與activity自己生命週期是同樣的 ;
2. 對於生命週期長的對象,能夠使用application context;
3. 避免非靜態的內部類,儘可能使用靜態類,避免生命週期問題,注意內部類對外部對象引用致使的生命週期變化。函數

詳細參見:
【簡書】https://www.jianshu.com/p/4f97baa0e8f7
【簡書】https://www.jianshu.com/p/94e0f9ab3f1d //Context做用域以及引發內存泄漏的場景
【csdn】https://blog.csdn.net/u014639129/article/details/52741497
 
補充:android app多語言切換的功能實現步驟:
1. 要把你本來的string.xml裏面的string翻譯成英語,須要新建一個文件夾values-en 放在資源文件夾res下面, 以下圖所示,其餘的語言種類也諸如此類。

2. 將包含相同name字段的英文內容的string.xml放入values-en目錄下便可。通常狀況下,系統會根據當前上下文自動切換調用相關的字段內容顯示,即中文環境調用默認的values目錄下的string.xml,英文環境會調用values-en目錄下的stirng.xml,實現自動切換效果。測試

3. 手動顯式的調用以下函數切換(本人還沒有測試,僅供參考):spa

public void updateLanguage(Locale locale)
{
  try
  {
    Object objIActMag;
    Class<?> clzIActMag = Class.forName("android.app.IActivityManager");
    Class<?> clzActMagNative = Class.forName("android.app.ActivityManagerNative");
    Method mtdActMagNative$getDefault = clzActMagNative.getDeclaredMethod("getDefault");
    objIActMag = mtdActMagNative$getDefault.invoke(clzActMagNative);
    Method mtdIActMag$getConfiguration = clzIActMag.getDeclaredMethod("getConfiguration");
    Configuration config = (Configuration) mtdIActMag$getConfiguration.invoke(objIActMag);
    config.locale = locale;
    Class[] clzParams = { Configuration.class };
    Method mtdIActMag$updateConfiguration = clzIActMag.getDeclaredMethod("updateConfiguration", clzParams); 
    mtdIActMag$updateConfiguration.invoke(objIActMag, config);
  } catch (Exception e) {
    e.printStackTrace();
  }.net

}翻譯

而後,調用它進行切換:設計

com.android.internal.app.LocalePicker.updateLocale(Locale.ENGLISH );視頻

直接經過反射獲取到系統設置語言那個類(LocalePicker),執行類裏的updateLocale(Locale locale)這個方法傳入語言設置更新系統語言。簡單粗暴。
 
注意:須要權限
<uses-permission android:name="android.permission.CHANGE_CONFIGURATION"/>
 
參見:
https://blog.csdn.net/xiaxiayige/article/details/45666359
相關文章
相關標籤/搜索