Примените новую тему для определенного вида без воссоздания Activity - PullRequest
0 голосов
/ 10 апреля 2019

Мое приложение отображает 6 фрагментов одновременно, поэтому воссоздание активности не является хорошим вариантом, так как заставляет экран мигать и сталкивается с некоторыми неожиданными проблемами, ухудшающими сохранение и восстановление состояния действий и фрагментов.

Я также не хочу пересматривать иерархию представлений и изменять каждое представление, поскольку необходимо изменить много атрибутов.

Все, что мне нужно, это просто применить новую тему (стиль) для NavigationView, которая скрыта в стороне от экрана и будет отображаться последней. В частности, я хочу изменить эти атрибуты:

itemBackground, itemIconTint, itemTextColor

1 Ответ

0 голосов
/ 10 апреля 2019

Благодаря Майку М

Я решил проблему, используя его способ:

public void updateNavigationViewLayout(){
    drawerLayout.removeView(navigationView);
    LayoutInflater inflater = LayoutInflater.from(new ContextThemeWrapper(this, R.style.newtheme));
    drawerLayout = (DrawerLayout) inflater.inflate(R.layout.navigation_drawer, drawerLayout);
    navigationView = drawerLayout.findViewById(R.id.nav_view);
}

Не забудьте отнести навигацию ViewView к новой. В противном случае при втором вызове этого метода новый NagivationView не будет удален, и вы добавите один дополнительный NavigationView, приводящий к этой ошибке:

Child drawer has absolute gravity LEFT but this DrawerLayout already has a drawer view along that edge
...