Android ActivityInjector: получить исключение жизненного цикла после смены языкаAndroid

Форум для тех, кто программирует под Android
Ответить Пред. темаСлед. тема
Anonymous
 Android ActivityInjector: получить исключение жизненного цикла после смены языка

Сообщение Anonymous »

В моем приложении для Android есть простое переключение между двумя языками.
Все работает нормально, язык переключается хорошо, но при отладке на реальном устройстве я заметил ошибку, раньше такого не было (Xiaomi Redmi 9). Там написано:
E/ActivityInjector: получить исключение жизненного цикла
java.lang.ClassCastException: android.os.BinderProxy нельзя привести к android.app .servertransaction.ClientTransaction

в android.app.ActivityInjector.checkAccessControl(ActivityInjector.java:24)
в android.app.Activity.onResume(Activity.java:1995)
в androidx.fragment.app.FragmentActivity.onResume(FragmentActivity.java:434)
в android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1457)
в android.app.Activity.performResume(Activity) .java:8264)
в android.app.ActivityThread.performResumeActivity(ActivityThread.java:4494)
в android.app.ActivityThread.handleResumeActivity(ActivityThread.java:4536)
в android. app.servertransaction.ResumeActivityItem.execute(ResumeActivityItem.java:52)
в android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:176)
в android.app.servertransaction.TransactionExecutor.execute( TransactionExecutor.java:97)
в android.app.ClientTransactionHandler.executeTransaction(ClientTransactionHandler.java:58)
в android.app.ActivityThread.handleRelaunchActivityLocally(ActivityThread.java:5498)
в android .app.ActivityThread.access$3400(ActivityThread.java:244)
в android.app.ActivityThread$H.handleMessage(ActivityThread.java:2114)
в android.os.Handler.dispatchMessage(Handler. java:106)
в android.os.Looper.loop(Looper.java:236)
в android.app.ActivityThread.main(ActivityThread.java:7861)
в java.lang .reflect.Method.invoke(собственный метод)
на com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:600)
на com.android.internal.os.ZygoteInit. main(ZygoteInit.java:967)
Однако приложение не вылетает и работает хорошо, но ошибка есть.
Причина может заключаться в том, что когда я вызываю super.recreate() после изменения языка, чтобы он вступил в силу, и перезапускаю MainActivity.
Когда я читал другие обсуждения, это может быть быть связано с Xiaomi, но у меня нет решения, как избежать этого или хотя бы попытаться использовать что-то вместо этого recreate().
Вот MainActivity, вы можете увидеть в saveLang< /code> метод. Я воссоздаю действие для отражения нового языка:

Код: Выделить всё

public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

if(getSupportActionBar() != null){
getSupportActionBar().hide();}

SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);

if(!prefs.getBoolean("firstTime", false)) {
String languageToLoad;
languageToLoad = Resources.getSystem().getConfiguration().getLocales().get(0).getLanguage();

lng = "sk".equals(languageToLoad) ? "sk" : "en";

SharedPreferences.Editor editor = prefs.edit();
editor.putBoolean("firstTime", true);
editor.putString("langx", lng);
editor.apply();

} else {lng = readLang();}

if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
updateBaseContextLocale(getBaseContext());
}

this.setContentView(R.layout.activity_main);

}

@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(updateBaseContextLocale(base));
}

private Context updateBaseContextLocale(Context context) {

SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);

if(!prefs.getBoolean("firstTime", false)) {
String languageToLoad;
languageToLoad = Resources.getSystem().getConfiguration().getLocales().get(0).getLanguage();

if ("sk".equals(languageToLoad) || "cs".equals(languageToLoad))
{lng = "sk";} else {lng = "en";}

SharedPreferences.Editor editor = prefs.edit();
editor.putBoolean("firstTime", true);
editor.putString("langx", lng);
editor.apply();}

else {
lng = prefs.getString("langx", "sk");
}

if(lng==null) {lng="sk";}

Locale locale = new Locale(lng);
Locale.setDefault(locale);

return updateResourcesLocale(context, locale);

}

private Context updateResourcesLocale(Context context, Locale locale) {
Configuration configuration = context.getResources().getConfiguration();
configuration.setLocale(locale);
return context.createConfigurationContext(configuration);
}

public void Langsk(View view)
{
String lng = readLang();
String newlng;

if (!lng.equals("sk")) {
newlng = "sk";
saveLang(newlng);
}
}

public void Langen(View view)
{
String lng = readLang();
String newlng;

if (lng.equals("sk")) {
newlng = "en";
saveLang(newlng);
}
}

private void saveLang(String lng) {
SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);
sharedPreferences.edit().putString("langx", lng).apply();

super.recreate();
overridePendingTransition(0, 0);
}

private String readLang() {
SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);
return sharedPreferences.getString("langx", "sk");
}
}
Я попробовал удалить super.recreate(), ошибка пропала, но язык, конечно, не обновляется.
Единственное, что помогло, это использование:

Код: Выделить всё

Intent i = new Intent(MainActivity.this, MainActivity.class);
overridePendingTransition(0, 0);
startActivity(i);
overridePendingTransition(0, 0);
вместо простого recreate().
При этом все работает без ошибок, однако я думаю, что это немного перебор.

Подробнее здесь: https://stackoverflow.com/questions/724 ... age-change
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Android»