Я исследую язык каждого приложения в своем текущем приложении для Android и добавляю его в свой файл манифеста Android.
android:configChanges = "locale|layoutDirection"
Вызывается функция My Activity onConfigurationChanged, и я вижу, как обнаружить изменения направления текста, используя приведенный ниже код:
@RequiresApi(Build.VERSION_CODES.N)
override fun onConfigurationChanged(newConfig: Configuration) {
super.onConfigurationChanged(newConfig)
if (newConfig.layoutDirection == Configuration.SCREENLAYOUT_LAYOUTDIR_LTR) {
finishAffinity()
recreate()
}
}
Как определить, что локаль изменилась?
Автор !newConfig.locales.isEmpty?
ACTION_LOCALE_CHANGED :
Действие при широковещании: Фактический региональный стандарт получателя изменился. Это происходит при изменении языкового стандарта устройства, языкового стандарта принимающего приложения (заданного с помощью LocaleManager.setApplicationLocales(LocaleList)) или языковых тегов региональных настроек. Могут быть получены получателями, объявленными в манифесте.
EXTRA_PACKAGE_NAME — это имя пакета, для которого изменена локаль.
EXTRA_LOCALE_LIST содержит локали, которые в данный момент установлены для указанного приложения.
Вы можете использовать BroadcastReceiver с фильтром намерений Intent.ACTION_LOCALE_CHANGED. Зарегистрируйте этот получатель, и когда языковой стандарт изменится, вы получите его в методе onReceive с объектом намерения, затем сопоставите его с intent.action == Intent.ACTION_LOCALE_CHANGED и выполните дальнейший процесс.
Для этого вы можете рассмотреть следующий пример:
public class LocaleReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction() == Intent.ACTION_LOCALE_CHANGED){
Log.v("LocaleRecevier", "received ACTION_LOCALE_CHANGED");
Locale newLocale = context.getResources().getConfiguration().locale();
Log.v("LocaleRecevier", newLocale);
}
}
}
Зарегистрируйте свой приемник Brodcast в файле манифеста.
<receiver
android:name = ".LocaleReceiver"
android:enabled = "true"
android:exported = "true">
<intent-filter>
<action android:name = "android.intent.action.LOCALE_CHANGED" />
</intent-filter>
</receiver>
Обновление 1
device settings, с within your app или какого-либо другого приложения. Стандартные API, предоставляемые в Android, позволяют обнаружить изменение локали.Однако есть несколько способов получить некоторое представление об этом:
Locale.getDefault());. Если они совпадают, у вас есть убедительный признак того, что изменение произошло со стороны вашего приложения.пример :
private Locale previousLocale;
public void setAppLocale(Locale newLocale) {
previousLocale = Locale.getDefault();
Locale.setDefault(newLocale);
// Update UI and resources based on newLocale
}
public boolean isLocaleChangeFromApp() {
return Locale.getDefault().equals(previousLocale);
}
// ...
// When locale changes (e.g., in an activity's `onCreate`):
Locale currentLocale = Locale.getDefault();
if (currentLocale.equals(previousLocale)) {
// Locale change likely from app
} else {
// Locale change likely from device settings
previousLocale = currentLocale;
}
Это, конечно, не надежно, поскольку другие приложения могут редактировать локаль, но это грубое указание, которое помогает установить контекст.
@Hector Пожалуйста, проверьте Обновление 1 части моего ответа. Он может подсказать вам, как достичь этого требования. Спасибо
Есть ли способ определить, произошло ли изменение локали из настроек устройства или из самого приложения?