findViewById() 不得为空

findViewById() must not be null

提问人:jas 提问时间:8/16/2021 最后编辑:jas 更新时间:7/13/2022 访问量:1475

问:

我正在尝试制作一个导航抽屉。我为抽屉制作了布局文件,为视图分配了适当的 ID,然后在 kotlin 文件中,我使用 关键字声明了与视图对应的变量。在方法中,我使用lateinitonCreate()findViewById(R.id...)

当我运行代码时,应用程序崩溃,logcat 向我显示一个 NullPointerException,说 findViewById(R.id.drawerLayout) 不能为 null。这是我的代码供参考:

class MainActivity : AppCompatActivity() {

lateinit var drawerLayout: DrawerLayout
lateinit var coordinatorLayout: CoordinatorLayout
lateinit var toolbar: Toolbar
lateinit var frameLayout: FrameLayout
lateinit var navigationView: NavigationView

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    drawerLayout = findViewById(R.id.drawerLayout)
    coordinatorLayout = findViewById(R.id.coordinatorLayout)
    toolbar = findViewById(R.id.toolbar)
    frameLayout = findViewById(R.id.frameLayout)
    navigationView = findViewById(R.id.navigationView)
    setUpToolbar()

    val actionBarDrawerToggle = ActionBarDrawerToggle(
        this@MainActivity,
        drawerLayout,
        R.string.open_drawer,
        R.string.close_drawer)

    drawerLayout.addDrawerListener(actionBarDrawerToggle)    
    actionBarDrawerToggle.syncState()
}


fun setUpToolbar(){
    supportActionBar?.title = "Toolbar Title"       
    supportActionBar?.setHomeButtonEnabled(true)
    supportActionBar?.setDisplayHomeAsUpEnabled(true) 


 }
}

这是我的xml代码:

<?xml version="1.0" encoding="utf-8"?>
<androidx.drawerlayout.widget.DrawerLayout 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:id="@+id/drawerLayout"
    tools:context=".MainActivity">

<androidx.coordinatorlayout.widget.CoordinatorLayout
    android:id="@+id/coordinatorLayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <androidx.appcompat.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:minHeight="?attr/actionBarSize"
        android:background="@color/design_default_color_primary_dark"
        android:theme="@style/ThemeOverlay.AppCompat.Dark"/>


    <FrameLayout
        android:id="@+id/frameLayout"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"/>

</androidx.coordinatorlayout.widget.CoordinatorLayout>

    <com.google.android.material.navigation.NavigationView
        android:id="@+id/navigationView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:headerLayout="@layout/drawer_header"
        app:menu="@menu/menu_drawer"
        android:layout_gravity = "start"/>

</androidx.drawerlayout.widget.DrawerLayout>

我几乎尝试了阳光下的所有东西,包括

  1. 以这种方式声明变量:,这有助于我避免findViewById行中的nullPointerException,但在代码的进一步部分中给了我一个完全不同的地狱级别,我必须使用将单击侦听器添加到切换中。我在stackoverflow上问了一个关于我在点击侦听器中遇到的错误的问题,普遍的共识是不要使用这种声明方式,以免使其为空。var drawerLayout: DrawerLayout? = nulldrawerLayout?.addDrawerListener(actionBarDrawerToggle)drawerLayout

  2. 我尝试以这种方式使用非空断言调用:但它仍然向我抛出相同的错误var drawerLayout: DrawerLayout!!

  3. 我已经检查了又重新检查,检查了布局文件中我的标签的 ID,因为每个人都说异常可能是由于 ID 和变量名称不同,但事实并非如此。我什至清除并重建了项目,使缓存无效,仍然没有变化。DrawerLayout

我不知道如何进行。我被这个错误困住了很长时间,似乎没有任何效果。如果有人能指出我哪里出错了,那就太好了

android xml android-studio kotlin nullpointerexception

评论

0赞 Shobhith 8/16/2021
您能添加您的XML代码吗?
0赞 jas 8/16/2021
@ShobhithYadav当然
0赞 Sdghasemi 8/16/2021
发布的是 xml 吗?activity_main.xml
0赞 jas 8/16/2021
@Sdghasemi是的
0赞 Sdghasemi 8/16/2021
是否确定要导入的类属于应用包,如果运行代码时带有行注释,会发生什么情况?RdrawerLayout = findViewById(R.id.drawerLayout)

答:

0赞 Vojin Purić 8/16/2021 #1

使用 lazy 而不是 lateinit 也将帮助您避免“地狱”

而不是 lateinit var drawerLayout: 抽屉布局

val drawerLayout: DrawerLayout by lazy{
  findViewById(R.id.drawerLayout)
}

此外,您将不再需要

drawerLayout = findViewById(R.id.drawerLayout)

drawerLayout 将在第一次需要时初始化

如果您有兴趣,请点击此处了解更多信息。

评论

0赞 jas 8/16/2021
我试了一下,它给了我这个错误:在接下来的两行中,它告诉我错误在行中,并且Caused by: java.lang.NullPointerException: <get-drawerLayout>(...) must not be nullval drawerLayout: DrawerLayout by lazy {val actionBarDrawerToggle = ActionBarDrawerToggle(this@MainActivity, drawerLayout, R.string.open_drawer, R.string.close_drawer)
0赞 Vojin Purić 8/20/2021
哦,我一开始没有注意到,但您缺少 AppBarConfiguration,这可能是问题所在。这是官方文档。developer.android.com/guide/navigation/......