android - Kotlin - findViewById 导致应用程序在启动后立即关闭
问题描述
我目前正在学习Kotlin,并且在学习BottomNaivgationView
教程时,我遇到了这个错误,即应用程序在启动后立即关闭。经过多次测试,我发现这是由findViewbyId()
我已经实现从菜单中选择视图引起的。但是,我不知道如何解决它。
MainActivity.kt
val TAG = "MainActivity"
val bottom_navigation : BottomNavigationView = findViewById(R.id.bottom_navigation)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val homeFragment = HomeFragment()
val listsFragment = ListsFragment()
val searchFragment = SearchFragment()
bottom_navigation.setOnNavigationItemSelectedListener {
when (it.itemId) {
R.id.nav_home -> {
setCurrentFragment(homeFragment)
Log.i(TAG, "Home Selected")
}
R.id.nav_lists -> {
setCurrentFragment(listsFragment)
Log.i(TAG, "My Lists Selected")
}
R.id.nav_search -> {
setCurrentFragment(searchFragment)
Log.i(TAG, "Search Selected")
}
}
true
}
}
private fun setCurrentFragment(fragment : Fragment) =
supportFragmentManager.beginTransaction().apply {
replace(R.id.fl_wrapper, fragment)
commit()
}
activity_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<FrameLayout
android:id="@+id/fl_wrapper"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_above="@+id/bottom_navigation" />
<com.google.android.material.bottomnavigation.BottomNavigationView
android:layout_width="match_parent"
android:layout_height="50dp"
android:id="@+id/bottom_navigation"
android:layout_alignParentBottom="true"
android:background="?android:attr/windowBackground"
app:itemBackground="@color/colorPrimary"
app:itemIconTint="@drawable/nav_item_colour_selected"
app:labelVisibilityMode="unlabeled"
app:menu="@menu/bottom_nav_menu"/>
</RelativeLayout>
解决方案
在findViewById()
使用活动生命周期方法设置活动布局之前,您不能调用..setContentView(R.layout.activity_main)
onCreate()
之前onCreate()
&setContentView(R.layout.activity_main)
活动类/行为尚未附加到其视图/布局。所以没有布局可以在..中找到视图
所以你需要转移
val bottom_navigation : BottomNavigationView = findViewById(R.id.bottom_navigation)
成为:
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val bottom_navigation : BottomNavigationView = findViewById(R.id.bottom_navigation)
val homeFragment = HomeFragment()
//......
推荐阅读
- c - Windows GDI 中的 Alpha 颜色组件
- python - Python3 - 生成匹配多个正则表达式的字符串,而不修改它们
- java - JavaFX 对话框:仅在按下确定按钮时运行 onClosingRequest
- batch-file - 从 inno setup 以管理员身份运行批处理文件,隐藏
- sql-server - 如何在 SQL Server 中识别夏令时实施点
- python - 其他模型中的 Keras 模型
- c# - 类设计 - 带有公共设置器的 ctor 或属性
- javascript - 模态缺少登录消息
- java - Spring Authentication,如何为坏凭证自定义responeText
- javascript - 如何在 bootstrap 4 datepicker 上更改语言