简体   繁体   中英

Why is trying to set an onClickListener on an element from an included layout throwing a NullPointerException?

I'm trying to link a layout to my main method using <include/> , but I keep crashing. I've been trying to fix it through reading about these issues for like a day and a half now, but I keep circling back to the same issue. I'd like to learn what I'm doing wrong so I can avoid this time sink in the future, but nothing that has been suggested as a possible solution elsewhere has worked.

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>

And, finally, the code from MainActivity.kt binding it together.

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

        }

        // ...
}

At the lines conntaining the onClickListeners, I'm receiving the following errors:

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>

I know this is a lot, but I have no clue what I'm excluding or missing or doing wrong.

I understand that the buttons I'm trying to set those listeners on are being read as null, but I don't really know how to make them not-so-null, I guess?

Remove the lines

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

and

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

Change this line

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

to

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

Hope this helps

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM