Почему мое приложение вылетает при изменении темы приложения

#android #kotlin #material-components-android #android-statusbar

Вопрос:

Мое приложение вылетает при запуске после того, как я изменил значение AppTheme с lt;style name="AppTheme" parent="Theme.MaterialComponents.Light.DarkActionBar"gt; на lt;style name="AppTheme" parent="Theme.MaterialComponents.DayNight.NoActionBar"gt;

Ниже приведен «HomeActivity.kt».

 class HomeActivity : BaseActivity() {   private lateinit var binding: ActivityHomeBinding   override fun onCreate(savedInstanceState: Bundle?) {  super.onCreate(savedInstanceState)  supportActionBar  binding = ActivityHomeBinding.inflate(layoutInflater)  setContentView(binding.root)   val window = window  window.statusBarColor = R.drawable.app_gradient_color_background   binding.navView.background = null   supportActionBar!!.setBackgroundDrawable(  ContextCompat.getDrawable(  this@HomeActivity,  R.drawable.app_gradient_color_background  )  )   val navView: BottomNavigationView = findViewById(R.id.nav_view)  val navController = findNavController(R.id.nav_host_fragment)  val appBarConfiguration = AppBarConfiguration(  setOf(  R.id.nav_home,  R.id.nav_orders,  R.id.nav_cart  )  )  setupActionBarWithNavController(navController, appBarConfiguration)   navView.setupWithNavController(navController)  }   override fun onBackPressed() {  doubleBackToExit()  } }  

Ниже приведен «Логкат».

 2021-11-23 02:04:20.714 11275-11275/com.abc.xyz E/AndroidRuntime: FATAL EXCEPTION: main Process: com.abc.xyz, PID: 11275 java.lang.RuntimeException: Unable to start activity ComponentInfo{com.abc.xyz/com.abc.xyz.ui.activities.HomeActivity}: java.lang.NullPointerException  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3835)  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:4011)  at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:85)  at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)  at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2325)  at android.os.Handler.dispatchMessage(Handler.java:106)  at android.os.Looper.loop(Looper.java:246)  at android.app.ActivityThread.main(ActivityThread.java:8633)  at java.lang.reflect.Method.invoke(Native Method)  at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:602)  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1130)  Caused by: java.lang.NullPointerException  at com.abc.xyz.ui.activities.HomeActivity.onCreate(HomeActivity.kt:47)  at android.app.Activity.performCreate(Activity.java:8207)  at android.app.Activity.performCreate(Activity.java:8191)  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1309)  

Пожалуйста, помогите мне исправить эту ошибку.

Чинить:

Я добавил следующее в файл xml макета

 lt;androidx.appcompat.widget.Toolbar  android:id="@ id/toolbar_home"  android:layout_width="match_parent"  android:layout_height="?attr/actionBarSize"  android:background="@drawable/app_gradient_color_background"  app:layout_constraintEnd_toEndOf="parent"  app:layout_constraintStart_toStartOf="parent"  app:layout_constraintTop_toTopOf="parent"  android:layout_marginTop="24dp"/gt;  

and the following in the onCreate of ‘HomeActivity.kt’

setSupportActionBar(binding.toolbarHome)

But the end result is not as I expected.

1- I can’t see a toolbar at the top 2- The colour of the BottomNavigationView is changed to dark when the Dark mode is ‘ON’, I don’t want that to happen. I want the colour of it white always.

Following is the ‘activity_home.xml’

 lt;?xml version="1.0" encoding="utf-8"?gt; lt;androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"  xmlns:app="http://schemas.android.com/apk/res-auto"  android:id="@ id/container"  android:layout_width="match_parent"  android:layout_height="match_parent"gt;   lt;androidx.appcompat.widget.Toolbar  android:id="@ id/toolbar_home"  android:layout_width="match_parent"  android:layout_height="?attr/actionBarSize"  android:background="@drawable/app_gradient_color_background"  app:layout_constraintEnd_toEndOf="parent"  app:layout_constraintStart_toStartOf="parent"  app:layout_constraintTop_toTopOf="parent"  android:layout_marginTop="24dp""/gt;   lt;com.google.android.material.bottomappbar.BottomAppBar  android:id="@ id/bottom_appbar"  android:layout_width="match_parent"  android:layout_height="wrap_content"  android:layout_gravity="bottom"  app:fabCradleMargin="10dp"  app:fabCradleRoundedCornerRadius="50dp"gt;   lt;com.google.android.material.bottomnavigation.BottomNavigationView  android:id="@ id/nav_view"  android:layout_width="match_parent"  android:layout_height="match_parent"  android:layout_marginEnd="16dp"  android:background="@android:color/transparent"  app:itemIconTint="@color/bottom_nav_color"  app:itemTextColor="@color/bottom_nav_color"  app:menu="@menu/bottom_nav_menu" /gt;   lt;/com.google.android.material.bottomappbar.BottomAppBargt;   lt;com.google.android.material.floatingactionbutton.FloatingActionButton  android:id="@ id/fab_new"  android:layout_width="wrap_content"  android:layout_height="wrap_content"  android:contentDescription="Show Categories"  android:scaleType="center"  app:layout_anchor="@id/bottom_appbar"  app:maxImageSize="56dp"  app:srcCompat="@drawable/fab_image"  app:tint="@null" /gt;   lt;fragment  android:id="@ id/nav_host_fragment"  android:name="androidx.navigation.fragment.NavHostFragment"  android:layout_width="match_parent"  android:layout_height="match_parent"  android:layout_marginBottom="50dp"  app:defaultNavHost="true"  app:layout_anchor="@id/bottom_appbar"  app:navGraph="@navigation/mobile_navigation" /gt;  lt;/androidx.coordinatorlayout.widget.CoordinatorLayoutgt;  

Following is what I have in the ‘HomeFragment.kt` before I create my own Toolbar. How can I make my new toolbar available in the ‘HomeFragment’?

 override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {  inflater.inflate(R.menu.home, menu)  super.onCreateOptionsMenu(menu, inflater)  

Edit:

NOTE: I just noticed that the issue regarding menu icon colour, icons are white when the ‘Dark Mode’ is ON and black when it’s OFF. I wanted this to be white always.

When I change fragment to androidx.fragment.app.FragmentContainerView app crashes with the below error. The error com.abc.xyz.ui.activities.HomeActivity.onCreateHomeActivity.kt:62) pointing at val navController = findNavController(R.id.nav_host_fragment)

 java.lang.RuntimeException: Unable to start activity ComponentInfo{com.abc.xyz/com.abc.xyz.ui.activities.HomeActivity}: java.lang.IllegalStateException: Activity com.abc.xyz.ui.activities.HomeActivity@2ed3cdc does not have a NavController set on 2131296976  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3835)  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:4011)  at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:85)  at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)  at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2325)  at android.os.Handler.dispatchMessage(Handler.java:106)  at android.os.Looper.loop(Looper.java:246)  at android.app.ActivityThread.main(ActivityThread.java:8633)  at java.lang.reflect.Method.invoke(Native Method)  at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:602)  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1130)  Caused by: java.lang.IllegalStateException: Activity com.abc.xyz.ui.activities.HomeActivity@2ed3cdc does not have a NavController set on 2131296976  at androidx.navigation.Navigation.findNavController(Navigation.java:61)  at androidx.navigation.ActivityKt.findNavController(Activity.kt:30)  at com.abc.xyz.ui.activities.HomeActivity.onCreate(HomeActivity.kt:62)  at android.app.Activity.performCreate(Activity.java:8207)  at android.app.Activity.performCreate(Activity.java:8191)  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1309)  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3808)  

Я добавил app:titleTextColor="@color/colorWhite" , чтобы изменить цвет заголовка, так как он был изменен на черный, когда я добавил новую пользовательскую панель инструментов. Однако я не могу изменить цвет пункта меню (поиск, настройки) и значок переполнения в toolbar . Как вы можете видеть на обоих изображениях ниже, они белые, а когда я запускаю приложение, они черные. Не могли бы вы сказать мне, где я должен внести изменения?

‘home_menu.xml’

введите описание изображения здесь

@drawable/ic_search

введите описание изображения здесь

Комментарии:

1. Потому что использование темы NoActionBar удаляет панель действий по умолчанию и supportActionBar в этом случае возвращает значение null

2. ОК. Как я могу справиться с этим в моем случае, пожалуйста?

3. Вам вообще не следует ссылаться на панель поддержки, если вы не создадите свою собственную панель инструментов в макете gt;gt;gt; затем используйте setSupportActionBar(myToolbar) перед ее использованием, чтобы избежать NPE, как в supportActionBar!!.setBackgroundDrawable( ContextCompat.getDrawable( this@HomeActivity, R.drawable.app_gradient_color_background ) )

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

Ответ №1:

Таким образом, исходный вопрос исправлен путем добавления настраиваемой панели инструментов, которая будет действовать как supportActionBar

1 — Я не вижу панели инструментов вверху

Поскольку он скрыт fragment (то есть находится за ним), чтобы исправить это, добавьте панель инструментов и фрагмент в a ConstraintLayout и отрегулируйте ограничение так, чтобы они не перекрывались:

 lt;?xml version="1.0" encoding="utf-8"?gt; lt;androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"  xmlns:app="http://schemas.android.com/apk/res-auto"  android:id="@ id/container"  android:layout_width="match_parent"  android:layout_height="match_parent"gt;   lt;com.google.android.material.bottomappbar.BottomAppBar  android:id="@ id/bottom_appbar"  android:layout_width="match_parent"  android:layout_height="wrap_content"  android:layout_gravity="bottom"  app:fabCradleMargin="10dp"  app:fabCradleRoundedCornerRadius="50dp"gt;   lt;com.google.android.material.bottomnavigation.BottomNavigationView  android:id="@ id/nav_view"  android:layout_width="match_parent"  android:layout_height="match_parent"  android:layout_marginEnd="16dp"  android:background="@android:color/transparent"  app:itemIconTint="@color/bottom_nav_color"  app:itemTextColor="@color/bottom_nav_color"  app:menu="@menu/bottom_nav_menu" /gt;   lt;/com.google.android.material.bottomappbar.BottomAppBargt;   lt;com.google.android.material.floatingactionbutton.FloatingActionButton  android:id="@ id/fab_new"  android:layout_width="wrap_content"  android:layout_height="wrap_content"  android:contentDescription="Show Categories"  android:scaleType="center"  app:layout_anchor="@id/bottom_appbar"  app:maxImageSize="56dp"  app:srcCompat="@drawable/fab_image"  app:tint="@null" /gt;   lt;androidx.constraintlayout.widget.ConstraintLayout  android:layout_width="match_parent"  android:layout_height="match_parent"gt;   lt;androidx.appcompat.widget.Toolbar  android:id="@ id/toolbar_home"  android:layout_width="match_parent"  android:layout_height="?attr/actionBarSize"  android:background="@drawable/app_gradient_color_background"  app:layout_constraintEnd_toEndOf="parent"  app:layout_constraintStart_toStartOf="parent"  app:layout_constraintTop_toTopOf="parent"/gt;   lt;androidx.fragment.app.FragmentContainerView  android:id="@ id/nav_host_fragment"  android:name="androidx.navigation.fragment.NavHostFragment"  android:layout_width="match_parent"  android:layout_height="0dp"  app:layout_constraintTop_toBottomOf="@ id/toolbar_home"  android:layout_marginBottom="50dp"  app:layout_constraintBottom_toBottomOf="parent"  app:defaultNavHost="true"  app:navGraph="@navigation/mobile_navigation" /gt;   lt;/androidx.constraintlayout.widget.ConstraintLayoutgt;   lt;/androidx.coordinatorlayout.widget.CoordinatorLayoutgt;  
  • Также нет необходимости в верхнем поле панели инструментов, поэтому android:layout_marginTop="24dp" оно удаляется.
  • Это app:layout_anchor="@id/bottom_appbar" нужно удалить из fragment , это требуется только в fab для крепления к нижней планке.
  • Измените значение fragment на androidx.fragment.app.FragmentContainerView «как fragment здесь», оно устарело.

2 — Цвет BottomNavigationView меняется на темный, когда включен темный режим, я не хочу, чтобы это происходило. Я хочу, чтобы он всегда был белого цвета.

Если у вас есть ночная версия themes.xml файл; пожалуйста, удалите его; если не исправлено; пожалуйста, поделитесь этим файлом

Комментарии:

1. Спасибо, почти решил проблемы, но у меня есть еще немного проблем. который я добавил в вопрос после «Редактировать». Надеюсь, вы тоже не откажетесь помочь мне их починить. В любом случае, я принял ваш ответ.

2. @Codist Для ошибки попробуйте заменить val navController = findNavController(R.id.nav_host_fragment) на val navHostFragment = supportFragmentManager.findFragmentById(R.id.nav_host_fragment) as NavHostFragment navHostFragment.navController

3. Для значка попробуйте добавить android:tint="#FFFFFF" в вектор

4. Это не сработало. Я создал новое векторное изображение и при его создании выбрал белый цвет, который тоже оказался черным. Тем не менее, еще один значок в меню появился белым.

5. У вас есть ночная версия colors.xml?