【问题标题】:java.lang.IllegalStateException: findViewById(R.id.addNotes) must not be nulljava.lang.IllegalStateException: findViewById(R.id.addNotes) 不能为空
【发布时间】:2021-02-01 23:51:43
【问题描述】:

我已经开始开发一个应用程序,但我在 MainActivity.java 类中遇到了一个错误,我无法识别请帮助我。提前致谢

MainActivity.kt

class MainActivity : AppCompatActivity() {
private lateinit var addNotes: FloatingActionButton
private lateinit var notesRV: RecyclerView
private lateinit var notesList: ArrayList<Notes>
private lateinit var realm: Realm

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

    val todayFragment = TodayFragment()
    val fragment =
        supportFragmentManager.findFragmentByTag(TodayFragment::class.java.simpleName)

    if (fragment !is TodayFragment) {
        supportFragmentManager.beginTransaction()
            .add(R.id.container, todayFragment, TodayFragment::class.java.simpleName)
            .commit()
    }
    Toast.makeText(this, "Welcome to NoteActivity", Toast.LENGTH_SHORT).show()
    //        init views
    addNotes = findViewById(R.id.addNotes)
    notesRV = findViewById(R.id.notesRV)
    //        onclick add notes btn
    addNotes.setOnClickListener{
        startActivity(Intent(this, AddNotesActivity::class.java))
        finish()
    }

    notesRV.layoutManager = StaggeredGridLayoutManager(2, LinearLayoutManager.VERTICAL)
    getAllNotes()
}

private fun getAllNotes() {
    notesList.clear()
    notesList = ArrayList()

    val result: RealmResults<Notes> = realm.where<Notes>(Notes::class.java).findAll()

    notesRV.adapter = NotesAdapter(this, result)
    notesRV.adapter!!.notifyDataSetChanged()
}

片段note.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/colorBackground"
    tools:context=".NoteFragment">

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/notesRV"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_margin="10dp"/>

    <com.google.android.material.floatingactionbutton.FloatingActionButton
        android:id="@+id/addNotes"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginEnd="25dp"
        android:layout_marginBottom="25dp"
        android:backgroundTint="@color/colorPrimary"
        android:src="@drawable/ic_write_white_create_24dp"
        app:backgroundTint="@color/design_default_color_background"
        app:fabSize="normal"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

这是我的日志

2020-10-19 15:07:58.580 24447-24447/com.d3ifcool.notivity E/AndroidRuntime: 致命异常: main 进程:com.d3ifcool.notivity,PID:24447 java.lang.RuntimeException:无法启动活动 ComponentInfo{com.d3ifcool.notivity/com.d3ifcool.notivity.MainActivity}: java.lang.IllegalStateException: findViewById(R.id.addNotes) 不能 为空 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3488) 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3635) 在 android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83) 在 android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) 在 android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:2175) 在 android.os.Handler.dispatchMessage(Handler.java:107) 在 android.os.Looper.loop(Looper.java:237) 在 android.app.ActivityThread.main(ActivityThread.java:7860) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1075) 引起:java.lang.IllegalStateException:findViewById(R.id.addNotes) 不能为空 在 com.d3ifcool.notivity.MainActivity.onCreate(MainActivity.kt:36) 在 android.app.Activity.performCreate(Activity.java:7955) 在 android.app.Activity.performCreate(Activity.java:7944) 在 android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1307) 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3463) 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3635) 在 android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83) 在 android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) 在 android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:2175) 在 android.os.Handler.dispatchMessage(Handler.java:107) 在 android.os.Looper.loop(Looper.java:237) 在 android.app.ActivityThread.main(ActivityThread.java:7860) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1075)

请帮帮我

引起:java.lang.IllegalStateException: findViewById(R.id.addNotes) 不能为空 在 com.d3ifcool.notivity.MainActivity.onCreate(MainActivity.kt:36)

【问题讨论】:

  • 因为R.id.addNotesfragment note.xml 中,而不在activity_main.xml 中。
  • 另外,findViewById 可能返回null,所以也许使用RecyclerView? 而不是RecyclerView 作为类型?
  • R.id.addnotes 可能不在 R.layout.activity_main 中,因此您只能从加载的视图中引用您的 id。如果 R.id.addnotes 在片段布局中,您必须在 onCreateView 片段中执行 findViewById,而不是在您的活动中。

标签: android


【解决方案1】:

由于您使用的是kotlin,所以您确实不需要findViewById方法,因为我们可以直接使用xml ids进行活动。

从活动中删除以下行

 private lateinit var addNotes: FloatingActionButton
 private lateinit var notesRV: RecyclerView

 addNotes = findViewById(R.id.addNotes)
 notesRV = findViewById(R.id.notesRV)

【讨论】:

  • 您的代码可以工作,但 addNotes.setOnClickListener{ startActivity(Intent(this, AddNotesActivity::class.java)) } 尝试调用虚拟方法 'void com.google.android.material. floatingactionbutton.FloatingActionButton.setOnClickListener(android.view.View$OnClickListener)' 在空对象引用上
  • 这是因为您正在为布局activity_main设置内容视图并且调用id在片段布局中。
  • 您只能调用当前活动的xml中存在的视图。
猜你喜欢
  • 2022-01-09
  • 1970-01-01
  • 1970-01-01
  • 2022-01-19
  • 1970-01-01
  • 2018-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多