#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
в этом случае возвращает значение null2. ОК. Как я могу справиться с этим в моем случае, пожалуйста?
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?