首页 > 解决方案 > 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>

标签: androidkotlinandroid-fragments

解决方案


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()
    //......

推荐阅读