Android API 25 Изменение языка во время выполнения

Я пытаюсь изменить язык во время выполнения. Он отлично работал с API 29 (версия Android 10). Мне нужно заставить его работать на Nougat 7.1.1 (API 25). Это был кошмар. Если мне нужно изменить язык устройства в настройках .., это сработает. Я вижу правильные чертежи и строки (strings.xml)

Моя цель - сделать так, чтобы переключение языка происходило во время выполнения.

Я вызываю activity.recreate () в onResume (). Экран становится черным. Я получаю исключение, и оно указывает на метод onCreate в строке 58. Это мои методы onCreate и onResume:

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);    // this is the line 58
        Toolbar toolbar = findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);


...
}



@Override
    protected void onResume() {
        super.onResume();
        hideSystemUI();
        prepareVideoPlayback();

       locale = new Locale("en");

       recreate();
    }

Возможно, вы все еще используете более свежий API. Поэтому новых классов не нашлось. Я не совсем понимаю, как вы делаете переключение уровней API на ft.


person Nesan Mano    schedule 15.03.2020    source источник
comment
Я добавил метод onResume выше   -  person Ben P.    schedule 15.03.2020
comment
Я подозреваю, что опубликованная трассировка стека - отвлекающий маневр, и что настоящая проблема либо дальше в logcat, либо вообще не в logcat.   -  person Nesan Mano    schedule 15.03.2020
comment
Исключение выбрасывается в строке, где я вызываю setContentView (). Это не имеет ничего общего с уровнем API.   -  person Ben P.    schedule 15.03.2020


Ответы (3)


Судя по обновленному коду, вы каждый раз вызываете _1_ в своем _2_ методе. По сути, это приведет к бесконечному циклу:

person Anton Astafiev    schedule 15.03.2020
comment
Я добавил еще несколько строк об исключении: в нем что-то говорится о методе android.graphics.PorterDuffColorFilter до версии до Android 4.1. В чем может быть проблема? Я правда не понимаю. По сути, мне нужно перезагрузить Drawables и strings, чтобы показать выбранный язык. В моем случае французский и английский - person Nesan Mano; 15.03.2020

Вам нужно будет придумать способ звонить recreate() только при необходимости.

  • onResume() называется
  • recreate() называется
  • Действие перезапускается и проходит через различные методы жизненного цикла.
  • onResume() называется
  • recreate() называется
  • Я нашел ответ на свой вопрос
  • ...

Действие запускается и проходит через различные методы жизненного цикла

person Ben P.    schedule 15.03.2020
comment
К вашему сведению, я удалил воссоздать из onResume. Я все еще не могу переключить язык - person Nesan Mano; 15.03.2020
comment
2020-03-14 23: 49: 32.400 13533-13533 / com.example.plasmavietiles W / art: До Android 4.1, метод android.graphics.PorterDuffColorFilter androidx.vectordrawable.graphics.drawable.VectorDrawableCompat.updateTintFilter (android.graphics.PorterDuffC , android.content.res.ColorStateList, android.graphics.PorterDuff $ Mode) неправильно переопределяет частный метод пакета в android.graphics.drawable.Drawable 2020-03-14 23: 49: 32.422 13533-13533 / com. example.plasmavietiles I / art: отклонение повторной инициализации ранее неудачного класса java.lang.Class: java.lang.NoClassDefFoundError: Неудачное разрешение: Landroid / view / View $ OnUnhandledKeyEventListener; ... Вызвано: java.lang.ClassNotFoundException: не удалось найти класс "android.view.View $ OnUnhandledKeyEventListener" по пути: DexPathList [[zip file »/data/app/com.example.plasmavietiles-2/base. apk "], nativeLibraryDirectories = [/ data / app / com.example.plasmavietiles-2 / lib / x86_64, / system / lib64, / vendor / lib64]] 2020-03-14 22: 54: 12.325 5972-5972 / com .example.plasmavietiles I / art: в java.lang.Class dalvik.system.BaseDexClassLoader.findClass (java.lang.String) (BaseDexClassLoader.java:56) 2020-03-14 22: 54: 12.325 5972-5972 / com .example.plasmavietiles I / art: в java.lang.Class java.lang.ClassLoader.loadClass (java.lang.String, boolean) (ClassLoader.java:380) 2020-03-14 22: 54: 12.325 5972-5972 /com.example.plasmavietiles I / art: в java.lang.Class java.lang.ClassLoader.loadClass (java.lang.String) (ClassLoader.java:312) 2020-03-14 22: 54: 12.325 5972-5972 /com.example.plasmavietiles I / art: at void androidx.core.view.ViewCompat.setOnApplyWindowInsetsListener (android.view.Vie w, androidx.core.view.OnApplyWindowInsetsListener) (ViewCompat.java:2421) 2020-03-14 22: 54: 12.326 5972-5972 / com.example.plasmavietiles I / art: в android.view.ViewGroup androidx.appcompat. app.AppCompatDelegateImpl.createSubDecor () (AppCompatDelegateImpl.java:779) 2020-03-14 22: 54: 12.326 5972-5972 / com.example.plasmavietiles I / art: at void androidx.appcompat.app.AppCompatDelegateImpl.ensureSubD (AppCompatDelegateImpl.java:659) 2020-03-14 22: 54: 12.326 5972-5972 / com.example.plasmavietiles I / art: в void androidx.appcompat.app.AppCompatDelegateImpl.setContentView (int) (AppCompatDelegateImpl.java:552 ) 2020-03-14 22: 54: 12.326 5972-5972 / com.example.plasmavietiles I / art: at void androidx.appcompat.app.AppCompatActivity.setContentView (int) (AppCompatActivity.java:161) 2020-03-14 22:54:12. 326 5972-5972 / com.example.plasmavietiles I / art: at void com.example.plasmavietiles.MainActivity.onCreate (android.os.Bundle) (MainActivity.java:58) 2020-03-14 22: 54: 12.326 5972 -5972 / com.example.plasmavietiles I / art: at void android.app.Activity.performCreate (android.os.Bundle) (Activity.java:6679) 2020-03-14 22: 54: 12.326 5972-5972 / com .example.plasmavietiles I / art: в void android.app.Instrumentation.callActivityOnCreate (android.app.Activity, android.os.Bundle) (Instrumentation.java:1118) 2020-03-14 22: 54: 12.326 5972-5972 /com.example.plasmavietiles I / art: в android.app.Activity android.app.ActivityThread.performLaunchActivity (android.app.ActivityThread $ ActivityClientRecord, android.content.Intent) (ActivityThread.java:2618) 14 марта 2020 г. 22: 54: 12.326 5972-5972 / com.example.plasmavietiles I / art: at void android.app.ActivityThread.handleLaunchActivity (android.app.ActivityThread $ ActivityClientRecord, android.content.Intent, java.lang.String) (ActivityThread . java: 2726) 2020-03-14 22: 54: 12.326 5972-5972 / com.example.plasmavietiles I / art: at void android.app.ActivityThread.-wrap12 (android.app.ActivityThread, android.app.ActivityThread $ ActivityClientRecord, android.content.Intent, java.lang.String) (ActivityThread.java:-1) 2020-03-14 22: 54: 12.326 5972-5972 / com.example.plasmavietiles I / art: at void android.app .ActivityThread $ H.handleMessage (android.os.Message) (ActivityThread.java:1477) 2020-03-14 22: 54: 12.326 5972-5972 / com.example.plasmavietiles I / art: at void android.os.Handler .dispatchMessage (android.os.Message) (Handler.java:102) 2020-03-14 22: 54: 12.326 5972-5972 / com.example.plasmavietiles I / art: at void android.os.Looper.loop () (Looper.java:154) 2020-03-14 22: 54: 12.326 5972-5972 / com.example.plasmavietiles I / art: в void android.app.ActivityThread.main (java.lang.String []) (ActivityThread .java: 6119) 2020-03-14 22: 54: 12.326 5972-5972 / com.example.plasmavietiles I / art: в java.lang.Object java.lan g.reflect.Method.invoke! (java.lang.Object, java.lang.Object []) (Method.java:-2) 2020-03-14 22: 54: 12.326 5972-5972 / com.example.plasmavietiles I / art: в void com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run () (ZygoteInit.java:886) 2020-03-14 22: 54: 12.326 5972-5972 / com.example.plasmavietiles I / art : в void com.android.internal.os.ZygoteInit.main (java.lang.String []) (ZygoteInit.java:776) 2020-03-14 22: 54: 13.956 5972-5983 / com.example.plasmavietiles I / art: Фоновая частичная параллельная очистка меток, GC освободил 21 (800B) объектов AllocSpace, 0 (0B) объектов LOS, 2 - person Nesan Mano; 15.03.2020

OnUnhandledKeyEventListener не является частью каких-либо API старше API 28. Другими словами, устройство должно запускать Androdi API> = 28.

Это проблема, если вы используете AndroidX на устройствах с API ‹28. Чтобы решить проблему, если вы используете API‹ 28, вам просто нужно убедиться, что ваш вызов Activity наследуется от Activity, а не от AppCompatActivity.

Замените этот открытый класс MainActivity расширяет AppCompatActivity

с участием

открытый класс MainActivity расширяет Activity

Как выглядит ваш _1_?

person Nesan Mano    schedule 18.03.2020