提问人:jas 提问时间:8/16/2021 最后编辑:jas 更新时间:7/13/2022 访问量:1475
findViewById() 不得为空
findViewById() must not be null
问:
我正在尝试制作一个导航抽屉。我为抽屉制作了布局文件,为视图分配了适当的 ID,然后在 kotlin 文件中,我使用 关键字声明了与视图对应的变量。在方法中,我使用lateinit
onCreate()
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>
我几乎尝试了阳光下的所有东西,包括
以这种方式声明变量:,这有助于我避免findViewById行中的nullPointerException,但在代码的进一步部分中给了我一个完全不同的地狱级别,我必须使用将单击侦听器添加到切换中。我在stackoverflow上问了一个关于我在点击侦听器中遇到的错误的问题,普遍的共识是不要使用这种声明方式,以免使其为空。
var drawerLayout: DrawerLayout? = null
drawerLayout?.addDrawerListener(actionBarDrawerToggle)
drawerLayout
我尝试以这种方式使用非空断言调用:但它仍然向我抛出相同的错误
var drawerLayout: DrawerLayout!!
我已经检查了又重新检查,检查了布局文件中我的标签的 ID,因为每个人都说异常可能是由于 ID 和变量名称不同,但事实并非如此。我什至清除并重建了项目,使缓存无效,仍然没有变化。
DrawerLayout
我不知道如何进行。我被这个错误困住了很长时间,似乎没有任何效果。如果有人能指出我哪里出错了,那就太好了
答:
使用 lazy 而不是 lateinit 也将帮助您避免“地狱”
而不是 lateinit var drawerLayout: 抽屉布局
用
val drawerLayout: DrawerLayout by lazy{
findViewById(R.id.drawerLayout)
}
此外,您将不再需要
drawerLayout = findViewById(R.id.drawerLayout)
drawerLayout 将在第一次需要时初始化
如果您有兴趣,请点击此处了解更多信息。
评论
Caused by: java.lang.NullPointerException: <get-drawerLayout>(...) must not be null
val drawerLayout: DrawerLayout by lazy {
val actionBarDrawerToggle = ActionBarDrawerToggle(this@MainActivity, drawerLayout, R.string.open_drawer, R.string.close_drawer)
评论
activity_main.xml
R
drawerLayout = findViewById(R.id.drawerLayout)