[Примечание: увидев этот ответ, посмотрите мой другой пост:
https://stackoverflow.com/a/51100507/787399
]
У меня другой подход к этому, и это работает.
Что я делаю, я создаю собственный расширенный класс Application и помечаю его в манифесте: -
public class MyApplication extends Application {
private AppCompatActivity currentActivity;
@Override
public void onCreate() {
super.onCreate();
}
public void setCurrentActivity(AppCompatActivity _activity){
this.currentActivity = _activity;
}
public AppCompatActivity getCurrentActivity() {
return currentActivity;
}
}
и
MyApplication в манифесте: -
...
<application
android:name=".core.MyApplication"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
...
Затем в моем BaseActivity (абстрактный класс, который расширяет AppCompatActivity, подразумевается расширение всеми действиями,
с общими функциями делегируйте классы, которые вы хотите сделать доступными во всех компонентах, фрагментах, адаптерах и т. д.): -
...
@Override
protected void onResume() {
super.onResume();
((MyApplication) getApplicationContext()).setCurrentActivity(this);
}
...
Затем в моих пользовательских представлениях (расширяет представления, TextViews для применения настроек и шрифтов локали): -
...
private void setFontFromAsset(Context context, AttributeSet attrs, int defStyle) {
BaseActivity activity = (BaseActivity)((MyApplication) context.getApplicationContext()).getCurrentActivity();
FontAndLocaleManager fontAndLocaleManager = activity.getFontAndLocaleManager();
fontAndLocaleManager.setFontFromAsset(this, R.styleable.FontButton, R.styleable.FontButton_btFontFace, attrs, defStyle);
}
...
В этом решении используются концепция наследования, классы делегатов и знания о том, что к контексту приложения можно получить доступ где угодно (его можно заменить собственным расширенным классом приложения в манифесте, а также жизненным циклом активности, где при возобновлении вы можете сообщить приложению (MyApplication), что это ваша текущая деятельность.
Теперь, так же, как вы хотите изменить локаль приложения, лучшее место для его изменения - незадолго до вызова setContentView(layout_id)
из activity
в методе onCreate(Bundle restoreState)
. Поэтому, как только locale
изменяется, вы должны отправить элемент управления обратно на экран dashboard/home
, чтобы сразу увидеть эффект.
Вы также можете обновить свой activity
, поскольку вы знаете, какой из них является текущим с getCurrentActivity()
вашего MyApplication
.
Чтобы установить языковой стандарт для вашего приложения, см. Программно установить языковой стандарт
Happy Coding ...: -)