Переключение языка Android Jetpack Compose через AppCompatDelegate не работает

Я пытаюсь создать переключатель языка в приложении для приложения, над которым я работаю, но я пробовал почти все методы, доступные в Stackoverflow. Я также попробовал Официальное руководство отсюда https://developer.android.com/guide/topics/resources/app-languages#api-implementation

Кажется, ничего не работает. Вот код на GitHub https://github.com/bauripalash/Pankti-Android

Вот экран настроек, где я меняю язык


fun Context.findActivity() : Activity? = when(this){
    is Activity -> this
    is ContextWrapper -> baseContext.findActivity()
    else -> null
}

fun changeLanguage( context: Context , language: String ){
    context.findActivity()?.runOnUiThread {
        val appLocale = LocaleListCompat.forLanguageTags(language)
        AppCompatDelegate.setApplicationLocales(appLocale)
        //context.findActivity()?.recreate()
    }

    //context.findActivity()?.recreate()
}

https://github.com/bauripalash/Pankti-Android/blob/ed8cc2a34a3c615b360860a3c6a3977b98742862/app/src/main/java/in/palashbauri/panktimob/views/SettingsScreen.kt#L103

А вот основная деятельность

class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {

        super.onCreate(savedInstanceState)
        AppCompatDelegate.setApplicationLocales(LocaleListCompat.forLanguageTags("bn"))
        AppCompatDelegate.getApplicationLocales()[0]?.let { Log.i("MainView" , it.displayLanguage) }
        setContent {
            PanktiMobTheme {
                // A surface container using the 'background' color from the theme
                Surface(
                    modifier = Modifier.fillMaxSize(),
                    color = MaterialTheme.colorScheme.background
                ) {
                    MainView()


                }
            }
        }
    }
}

Воссоздание активности тоже не работает.

Я перепробовал почти все методы, которые смог найти на Stackoverflow и в других местах.

Android context.getResources.updateConfiguration() устарел

Как вызвать перекомпоновку после updateConfiguration?

Как заставить реактивный ранец компоноваться заново?

Изменение языка Android с помощью JetPack Compose

Я знаю, что здесь часто задают этот вопрос. Но может кто-нибудь помочь мне здесь.


2
194
1

Ответ:

Решено

Чтобы работать, измените тему MaterialTheme на тему AppCompat в файле Themes.xml в папке значений.

Проверьте этот блог для добавления Android локализация или мультиязычность от царапина - кликните сюда

пример : темы.xml

<?xml version = "1.0" encoding = "utf-8"?>
<resources>

<!--    <style name = "Theme.SatCat" parent = "android:Theme.Material.Light.NoActionBar" />-->
    <style name = "Theme.SatCat" parent = "Theme.AppCompat.Light" />
</resources>

ОБНОВИТЬ : Для Jetpack Compose,

Даже если вы добавите android:theme="@style/Theme.SatCat" из MainActivity в AndroidManifest.xml. он будет работать только выше setContent{} вашего ComponentActivity. потому что мы добавили нашу MaterialTheme внутрь setContent{}.

Решение :

  • Мы должны изменить нашу MainActivity, расширяющую ComponentActivity на AppCompatActivity, и использовать тему как тему AppCompat в манифесте.

  • После мы изменим его работу в Jetpack Compose.

  • Другое дело, в вашем случае перейдите в раскрывающееся меню «Настройки экрана». После выбора любого языка вы должны сохранить этот код, а не имя. . . .

Больше информации : если мы используем AppCompatDelegate.setApplicationLocales() с MaterialTheme, Context становится NULL, поэтому он не может создать Locale Manager.

Контекст имеет значение null, потому что sActivityDelegates пуст.

Даже я не знаю, что такое sActivityDelegates

Но как только я изменю тему на AppCompat. он становится рабочим.

Расскажите нам, если кто-то знает о sActivityDelegates и почему он не добавляется при жизненном цикле в postCreate, как они упоминают в комментариях. это было бы оценено.