活动在 Kotlin 中不起作用的底部导航视图
Bottom Navigation View with activities not working in Kotlin
我是 Kotlin 的新手,所以我不知道如何解决这个问题。
我创建了一个底部导航视图,用于在活动之间切换。当我调用 BottomNavigationView.OnNavigationItemSelectedListener 时,我的应用程序崩溃了,我不知道为什么。有人可以帮忙吗?
我已经搜索过了,但我只在碎片上找到答案。
我的 MainActivity 代码:
class MainActivity : AppCompatActivity() {
private val navigasjonen = BottomNavigationView.OnNavigationItemSelectedListener { item ->
when (item.itemId) {
R.id.home -> {
return@OnNavigationItemSelectedListener false
}
R.id.leggTilNavigasjon -> {
val intent = Intent(this@MainActivity, AddRec::class.java)
startActivity(intent)
return@OnNavigationItemSelectedListener true
}
R.id.favoritter -> {
val intent = Intent(this@MainActivity, MyRecipes::class.java)
startActivity(intent)
return@OnNavigationItemSelectedListener true
}
R.id.utforsk -> {
return@OnNavigationItemSelectedListener true
}
}
false
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val bottomNavigation = findViewById<BottomNavigationView>(R.id.bottom_navigation)
//bottomNavigation.setSelectedItemId(R.id.home)
bottomNavigation.setOnNavigationItemSelectedListener(navigasjonen)
}
}
我的xml代码:
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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"
android:background="@color/colorLys"
android:id="@+id/home">
<com.google.android.material.bottomnavigation.BottomNavigationView
android:id="@+id/navigationView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
android:background="?android:attr/windowBackground"
app:menu="@menu/navigasjon" />
</androidx.constraintlayout.widget.ConstraintLayout>
我的错误:
2020-01-27 14:20:06.197 20309-20309/com.example.foodleaks E/AndroidRuntime:致命异常:main
进程:com.example.foodleaks,PID:20309
java.lang.RuntimeException: 无法启动 activity ComponentInfo{com.example.foodleaks/com.example.foodleaks.MainActivity}: java.lang.NullPointerException: 尝试调用虚拟方法 'void com.google.android.material.bottomnavigation.BottomNavigationView.setOnNavigationItemSelectedListener(com.google.android.material.bottomnavigation.BottomNavigationView$OnNavigationItemSelectedListener)' 在空对象引用上
在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2913)
在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3048)
在 android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78)
在 android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)
在 android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)
在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1808)
在 android.os.Handler.dispatchMessage(Handler.java:106)
在 android.os.Looper.loop(Looper.java:193)
在 android.app.ActivityThread.main(ActivityThread.java:6669)
在 java.lang.reflect.Method.invoke(本机方法)
在 com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
由以下原因引起:java.lang.NullPointerException:尝试在空对象引用上调用虚方法 'void com.google.android.material.bottomnavigation.BottomNavigationView.setOnNavigationItemSelectedListener(com.google.android.material.bottomnavigation.BottomNavigationView$OnNavigationItemSelectedListener)'
在 com.example.foodleaks.MainActivity.onCreate(MainActivity.kt:39)
在 android.app.Activity.performCreate(Activity.java:7136)
在 android.app.Activity.performCreate(Activity.java:7127)
在 android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1271)
在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2893)
在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3048)
在 android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78)
在 android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)
在 android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)
在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1808)
在 android.os.Handler.dispatchMessage(Handler.java:106)
在 android.os.Looper.loop(Looper.java:193)
在 android.app.ActivityThread.main(ActivityThread.java:6669)
在 java.lang.reflect.Method.invoke(本机方法)
在 com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
在你的 findViewById
中,你正在传递 R.id.bottom_navigation
:
val bottomNavigation = findViewById<BottomNavigationView>(R.id.bottom_navigation)
并且在布局中它具有 id:
android:id="@+id/navigationView"
您可以更改布局上的 ID:
android:id="@+id/bottom_navigation"
或者在 findViewById 中更改它:
val bottomNavigation = findViewById<BottomNavigationView>(R.id.navigationView)
保持一致,以便它可以找到 BottomNavigationView 元素,并且不会因空对象引用而崩溃。
堆栈跟踪中存在错误。我建议学习阅读 Java/Android stacktraces :)
堆栈跟踪中的罪魁祸首:
Attempt to invoke virtual method 'void com.google.android.material.bottomnavigation.BottomNavigationView.setOnNavigationItemSelectedListener(com.google.android.material.bottomnavigation.BottomNavigationView$OnNavigationItemSelectedListener)' on a null object reference
您的 BottomNavigationView
为空。为什么?
查看您在布局中的声明:
<com.google.android.material.bottomnavigation.BottomNavigationView
android:id="@+id/navigationView
这就是您找到视图的方式:
findViewById<BottomNavigationView>(R.id.bottom_navigation)
您使用的视图 ID 有误。
我是 Kotlin 的新手,所以我不知道如何解决这个问题。
我创建了一个底部导航视图,用于在活动之间切换。当我调用 BottomNavigationView.OnNavigationItemSelectedListener 时,我的应用程序崩溃了,我不知道为什么。有人可以帮忙吗?
我已经搜索过了,但我只在碎片上找到答案。
我的 MainActivity 代码:
class MainActivity : AppCompatActivity() {
private val navigasjonen = BottomNavigationView.OnNavigationItemSelectedListener { item ->
when (item.itemId) {
R.id.home -> {
return@OnNavigationItemSelectedListener false
}
R.id.leggTilNavigasjon -> {
val intent = Intent(this@MainActivity, AddRec::class.java)
startActivity(intent)
return@OnNavigationItemSelectedListener true
}
R.id.favoritter -> {
val intent = Intent(this@MainActivity, MyRecipes::class.java)
startActivity(intent)
return@OnNavigationItemSelectedListener true
}
R.id.utforsk -> {
return@OnNavigationItemSelectedListener true
}
}
false
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val bottomNavigation = findViewById<BottomNavigationView>(R.id.bottom_navigation)
//bottomNavigation.setSelectedItemId(R.id.home)
bottomNavigation.setOnNavigationItemSelectedListener(navigasjonen)
}
}
我的xml代码:
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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"
android:background="@color/colorLys"
android:id="@+id/home">
<com.google.android.material.bottomnavigation.BottomNavigationView
android:id="@+id/navigationView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
android:background="?android:attr/windowBackground"
app:menu="@menu/navigasjon" />
</androidx.constraintlayout.widget.ConstraintLayout>
我的错误:
2020-01-27 14:20:06.197 20309-20309/com.example.foodleaks E/AndroidRuntime:致命异常:main 进程:com.example.foodleaks,PID:20309 java.lang.RuntimeException: 无法启动 activity ComponentInfo{com.example.foodleaks/com.example.foodleaks.MainActivity}: java.lang.NullPointerException: 尝试调用虚拟方法 'void com.google.android.material.bottomnavigation.BottomNavigationView.setOnNavigationItemSelectedListener(com.google.android.material.bottomnavigation.BottomNavigationView$OnNavigationItemSelectedListener)' 在空对象引用上 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2913) 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3048) 在 android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78) 在 android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108) 在 android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1808) 在 android.os.Handler.dispatchMessage(Handler.java:106) 在 android.os.Looper.loop(Looper.java:193) 在 android.app.ActivityThread.main(ActivityThread.java:6669) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858) 由以下原因引起:java.lang.NullPointerException:尝试在空对象引用上调用虚方法 'void com.google.android.material.bottomnavigation.BottomNavigationView.setOnNavigationItemSelectedListener(com.google.android.material.bottomnavigation.BottomNavigationView$OnNavigationItemSelectedListener)' 在 com.example.foodleaks.MainActivity.onCreate(MainActivity.kt:39) 在 android.app.Activity.performCreate(Activity.java:7136) 在 android.app.Activity.performCreate(Activity.java:7127) 在 android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1271) 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2893) 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3048) 在 android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78) 在 android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108) 在 android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1808) 在 android.os.Handler.dispatchMessage(Handler.java:106) 在 android.os.Looper.loop(Looper.java:193) 在 android.app.ActivityThread.main(ActivityThread.java:6669) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
在你的 findViewById
中,你正在传递 R.id.bottom_navigation
:
val bottomNavigation = findViewById<BottomNavigationView>(R.id.bottom_navigation)
并且在布局中它具有 id:
android:id="@+id/navigationView"
您可以更改布局上的 ID:
android:id="@+id/bottom_navigation"
或者在 findViewById 中更改它:
val bottomNavigation = findViewById<BottomNavigationView>(R.id.navigationView)
保持一致,以便它可以找到 BottomNavigationView 元素,并且不会因空对象引用而崩溃。
堆栈跟踪中存在错误。我建议学习阅读 Java/Android stacktraces :)
堆栈跟踪中的罪魁祸首:
Attempt to invoke virtual method 'void com.google.android.material.bottomnavigation.BottomNavigationView.setOnNavigationItemSelectedListener(com.google.android.material.bottomnavigation.BottomNavigationView$OnNavigationItemSelectedListener)' on a null object reference
您的 BottomNavigationView
为空。为什么?
查看您在布局中的声明:
<com.google.android.material.bottomnavigation.BottomNavigationView
android:id="@+id/navigationView
这就是您找到视图的方式:
findViewById<BottomNavigationView>(R.id.bottom_navigation)
您使用的视图 ID 有误。