У меня есть проект Xamarin.Android с MvvmCross 6.1.2 и ресурсами Resx в стандартной библиотеке .NET ( Базовый проект ).
tl; dr: Я хотел бы изменить язык в настройках приложения без перезапуска приложения.Текущий подход требует перезапуска приложения или вызывает сбой приложения из-за высокого использования памяти после нескольких переключателей .
Как это было
До сих пор я использовал пользовательские AppLanguageService
, который менял язык с помощью CultureInfo
.
private void ChangeLocally(string code)
{
Settings.ApplicationLanguage = code;
Strings.Culture = new CultureInfo(code);
CultureInfo.DefaultThreadCurrentUICulture = Strings.Culture;
((MvxResxTextProvider) textProvider).CurrentLanguage = Strings.Culture;
}
В моих макетах Android я использовал привязку MvxLang
для отображения переведенных терминов.Чтобы изменить язык на Android, я также звонил Recreate()
в моем BaseActivity
.Это, однако, вызывало какие-то проблемы с производительностью.После нескольких таких языковых переключений приложение было необычайно медленным и зависало из-за высокого потребления памяти.Кажется, что модели представлений и представления были воссозданы, но старые модели представлений были сохранены в фоновом режиме.
Я также попробовал официальный подход с файлами strings.xml
для соответствующих локалей в каталоге values
, ноизменение языка было видно только после Recreate()
вызова или перезапуска приложения.
Как сейчас
Затем я отказался от Recreate()
подхода и вместо этого попытался просто обновить представления Android после смены языка.К сожалению, это было связано с несколькими проблемами:
- Мне пришлось заменить привязки MvxLang на более общую привязку для обновления при изменении свойства, т. Е.
local:MvxBind="Text Language(TextSource, 'translated_term')"
(MvxLang
только OneTime
) - Мне пришлось позвонить
RaiseAllPropertiesChanged()
в BaseViewModel
- , но только текущее действие было обновлено, и, например, панель вкладок и другие действия и фрагменты остались на предыдущем языке
Только сейчасперезапуск приложения позволяет использовать приложение на другом языке.
Что бы я хотел иметь
Я хотел бы иметь возможность обновлять представления Android без перезапуска приложения, или я бы хотелиспользуйте Recreate()
вызов, не заполняя память (т. е. либо удаляя старые виды и просматривая модели, либо используя их повторно).Есть ли какой-нибудь правильный способ достичь этого?