为什么试图在包含布局中的元素上设置onClickListener,从而引发NullPointerException



我试图使用<include/>将布局链接到我的主方法,但我一直崩溃。一天半以来,我一直在努力通过阅读这些问题来解决这个问题,但我一直在重复同样的问题。我想知道我做错了什么,这样我就可以避免未来的这段时间,但其他地方提出的可能解决方案都没有奏效。

item_menu_layout.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"
android:id="@+id/ItemMenu"
android:layout_width="match_parent"
android:layout_height="match_parent">
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/ItemMenuLayout"
android:layout_width="350dp"
android:layout_height="400dp"
android:background="#FFFFFF"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<TextView
android:id="@+id/itemMenuTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:text="@string/item_menu_label"
android:textSize="24sp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/itemMenuDescription"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:padding="10dp"
android:text="@string/lorem_ipsum"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/itemMenuTitle" />
<LinearLayout
android:id="@+id/SelectActionLayout"
android:layout_width="320dp"
android:layout_height="wrap_content"
android:orientation="horizontal"
app:layout_constraintBottom_toTopOf="@+id/deleteOrSetLayout"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent">
<Button
android:id="@+id/addItemButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="@string/add_label"
android:textAllCaps="false" />
<Button
android:id="@+id/modifyItemButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="@string/modify_label"
android:textAllCaps="false" />
</LinearLayout>
<LinearLayout
android:id="@+id/deleteOrSetLayout"
android:layout_width="320dp"
android:layout_height="wrap_content"
android:layout_marginBottom="60dp"
android:orientation="horizontal"
app:layout_constraintBottom_toTopOf="@+id/button5"
app:layout_constraintEnd_toEndOf="@+id/SelectActionLayout"
app:layout_constraintStart_toStartOf="@+id/SelectActionLayout">
<Button
android:id="@+id/deleteItemButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="@string/delete_label"
android:textAllCaps="false" />
<Button
android:id="@+id/setItemsButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="@string/set_active_label"
android:textAllCaps="false" />
</LinearLayout>
<Button
android:id="@+id/button5"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/return_to_grid_label"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.constraintlayout.widget.ConstraintLayout>

add_item_layout.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:id="@+id/AddItemLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#FFFFFF">
<TextView
android:id="@+id/addItemTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:text="@string/add_item_title"
android:textSize="26sp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/addItemDescription"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:padding="15dp"
android:text="@string/lorem_ipsum"
android:textAlignment="center"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/addItemTitle" />
<Button
android:id="@+id/submitItemButton"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Add Item"
android:textAllCaps="false"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" />
<LinearLayout
android:id="@+id/NameLayout"
android:layout_width="300dp"
android:layout_height="50dp"
android:layout_marginTop="16dp"
android:orientation="horizontal"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/addItemDescription">
<TextView
android:id="@+id/nameTag"
android:layout_width="23dp"
android:layout_height="38dp"
android:layout_weight="1"
android:padding="5dp"
android:text="@string/name_label"
android:textAlignment="center"
android:textSize="20sp" />
<EditText
android:id="@+id/nameInput"
android:layout_width="70dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:ems="10"
android:inputType="textPersonName" />
</LinearLayout>
<LinearLayout
android:id="@+id/DescriptionLayout"
android:layout_width="300dp"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:layout_weight="1"
android:orientation="horizontal"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/NameLayout">
<TextView
android:id="@+id/descriptionTag"
android:layout_width="23dp"
android:layout_height="38dp"
android:layout_weight="1"
android:padding="5dp"
android:text="@string/description_title"
android:textAlignment="center"
android:textSize="20sp" />
<EditText
android:id="@+id/descriptionInput"
android:layout_width="70dp"
android:layout_height="100dp"
android:layout_weight="1"
android:ems="10"
android:gravity="center"
android:inputType="textMultiLine" />
</LinearLayout>
<LinearLayout
android:id="@+id/LabelLayout"
android:layout_width="300dp"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:orientation="horizontal"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/DescriptionLayout">
<TextView
android:id="@+id/labelTag"
android:layout_width="23dp"
android:layout_height="38dp"
android:layout_weight="1"
android:text="Label"
android:textAlignment="center"
android:textSize="20sp" />
<EditText
android:id="@+id/labelInput"
android:layout_width="70dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:ems="10"
android:inputType="textPersonName" />
</LinearLayout>
<LinearLayout
android:id="@+id/ImageLayout"
android:layout_width="300dp"
android:layout_height="wrap_content"
android:layout_marginTop="26dp"
android:gravity="center"
android:orientation="horizontal"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/LabelLayout">
<TextView
android:id="@+id/imageTag"
android:layout_width="23dp"
android:layout_height="38dp"
android:layout_weight="1"
android:gravity="bottom|center_horizontal"
android:text="Image"
android:textSize="20sp" />
<Button
android:id="@+id/addImageButton"
android:layout_width="175dp"
android:layout_height="wrap_content"
android:layout_marginTop="5dp"
android:gravity="center|center_vertical"
android:text="Add Image ..."
android:textAllCaps="false" />
</LinearLayout>
<ImageView
android:id="@+id/uploadedImagePreview"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintBottom_toTopOf="@+id/submitItemButton"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/ImageLayout"
tools:srcCompat="@tools:sample/avatars" />
</androidx.constraintlayout.widget.ConstraintLayout>

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/ItemGridLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#fff"
tools:context=".MainActivity">
<include
android:id="@+id/addItemLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
layout="@layout/add_item_layout" />
<include
android:id="@+id/itemMenuLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
layout="@layout/item_menu_layout"/>
<!-- <include layout="@layout/header" android:id="@+id/header"/> -->
<GridView
android:id="@+id/gridView"
android:layout_width="match_parent"
android:layout_height="500dp"
android:layout_above="@+id/ButtonLayout"
android:divider="#000000"
android:dividerHeight="1dp"
android:gravity="center_vertical"
android:horizontalSpacing="10dp"
android:listSelector="@drawable/list_selector"
android:numColumns="2"
android:padding="5dp"
android:stretchMode="columnWidth"
android:verticalSpacing="10dp">
</GridView>
<TextView
android:id="@+id/projectTitleView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentStart="true"
android:layout_alignParentTop="true"
android:layout_alignParentEnd="true"
android:layout_marginStart="174dp"
android:layout_marginTop="22dp"
android:layout_marginEnd="179dp"
android:text="TextView" />
<LinearLayout
android:id="@+id/ButtonLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:background="#000000">
<Button
android:id="@+id/incrementButton"
android:layout_width="wrap_content"
android:layout_height="70dp"
android:layout_weight=".8"
android:backgroundTint="#000000"
android:text="@string/increment_button_plus"
android:textColor="#FFFFFF"
android:textSize="40dp" />
<Button
android:id="@+id/decrementButton"
android:layout_width="wrap_content"
android:layout_height="70dp"
android:layout_weight=".8"
android:backgroundTint="#000000"
android:text="@string/decrement_button_minus"
android:textColor="#FFFFFF"
android:textSize="40dp" />
</LinearLayout>
</RelativeLayout>

最后,MainActivity.kt中的代码将其绑定在一起。

package com.mts.itemcounter
import android.content.Context
import android.content.SharedPreferences
import android.graphics.Color
import android.os.Bundle
import android.view.Menu
import android.view.MenuInflater
import android.view.MenuItem
import android.view.View
import android.widget.*
import androidx.appcompat.app.AppCompatActivity
import androidx.constraintlayout.widget.ConstraintLayout
import com.google.gson.Gson
import kotlinx.android.synthetic.main.activity_main.*
import kotlinx.android.synthetic.main.item_menu_layout.*
import kotlinx.android.synthetic.main.add_item_layout.*
import java.util.*
class MainActivity : AppCompatActivity() {
companion object {
var itemList: ArrayList<Item> = arrayListOf()
val configFileName: String = "itemconfig.txt"
val PREFS_NAME = "ItemList"
val ITEMS = "ITEMS"
}
// Storage-Related Variables
lateinit var inputPreferences: SharedPreferences
lateinit var preferences: SharedPreferences
lateinit var gson: Gson
lateinit var currentProject: Project
var selectedPosition = 0
var gridView: GridView? = null
var adapter: ItemListAdapter? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
currentProject = ChooseProjectActivity.projectList[ChooseProjectActivity.selectedPosition] // The active project, determined by the project selected from the Project ListView
var utility = Utils()
var itemLayout = findViewById<ConstraintLayout>(R.id.AddItemLayout)
var menuLayout = findViewById<ConstraintLayout>(R.id.ItemMenu)
// Set system UI elements to a specific color
window.statusBarColor = Color.BLACK
window.navigationBarColor = Color.BLACK
// Set up SharedPreferences - this allows for preferences to be saved internally between sessions
preferences = this.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE)
gson = Gson()
// Set up buttons and adapters
instantiateGridView()
// Item GridView
gridView!!.onItemClickListener =
AdapterView.OnItemClickListener { _, _, position, id ->
// Get the GridView selected/clicked item text
selectedPosition = position
}
// Add Item Button
val addItemButton = menuLayout.findViewById<Button>(R.id.addItemButton)
addItemButton.setOnClickListener {     // ERROR HERE
}
// Submit Item Button
val submitItemButton = itemLayout.findViewById<Button>(R.id.submitItemButton)
submitItemButton.setOnClickListener {     // ERROR HERE
}
// ...
}

在连接onClickListeners的行中,我收到以下错误:

E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.mts.itemcounter, PID: 14798
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.mts.itemcounter/com.mts.itemcounter.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.Button.setOnClickListener(android.view.View$OnClickListener)' on a null object reference
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2913)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3048)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1808)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:6669)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.Button.setOnClickListener(android.view.View$OnClickListener)' on a null object reference
at com.mts.itemcounter.MainActivity.onCreate(MainActivity.kt:80)
at android.app.Activity.performCreate(Activity.java:7136)
at android.app.Activity.performCreate(Activity.java:7127)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1271)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2893)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3048) 
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78) 
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108) 
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1808) 
at android.os.Handler.dispatchMessage(Handler.java:106) 
at android.os.Looper.loop(Looper.java:193) 
at android.app.ActivityThread.main(ActivityThread.java:6669) 
at java.lang.reflect.Method.invoke(Native Method) 
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858) 

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.mts.itemcounter">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".ChooseProjectActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".MainActivity"/>
</application>
</manifest>

我知道这是很多,但我不知道我在排除什么、错过什么或做错了什么。

我知道我试图设置这些监听器的按钮被读取为null,但我真的不知道如何使它们不那么null,我想?

删除行

val addItemButton = menuLayout.findViewById<Button>(R.id.addItemButton)

val submitItemButton = itemLayout.findViewById<Button>(R.id.submitItemButton)

更改此行

var menuLayout = findViewById<ConstraintLayout>(R.id.ItemMenu)

var menuLayout = findViewById<ConstraintLayout>(R.id.ItemMenuLayout)

希望这能帮助

最新更新