Search code examples
androidapikotlin

Why am I getting NullPointerException error ? trying to pass a value from an edit text


Manual Search Activity Code:

package com.example.theweathertoday

import android.os.AsyncTask
import android.os.Bundle
import android.view.View
import android.widget.Button
import android.widget.EditText
import android.widget.ProgressBar
import android.widget.RelativeLayout
import android.widget.TextView
import androidx.appcompat.app.AppCompatActivity
import org.json.JSONObject
import java.net.URL
import java.text.SimpleDateFormat
import java.util.*

class ManualSearchActivity : AppCompatActivity()
{


    val API : String = "your api"
    val EnterCityEditText: String = findViewById<EditText>(R.id.enter_city_edit_text).text.toString()

    override fun onCreate(savedInstanceState: Bundle?)
    {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_manual_search)
        val SearchCityButton = findViewById<Button>(R.id.button_search_city)

        SearchCityButton.setOnClickListener(View.OnClickListener { weatherCall().execute() })

    }


    inner class weatherCall() : AsyncTask<String, Void, String>()
    {
        override fun onPreExecute()
        {
            super.onPreExecute()
            findViewById<ProgressBar>(R.id.loader).visibility = View.VISIBLE
            findViewById<RelativeLayout>(R.id.mainRelativeContainer).visibility = View.GONE
            findViewById<TextView>(R.id.ErrorText).visibility = View.GONE

        }

        override fun doInBackground(vararg p0: String?): String?
        {
            var response:String?
            try
            {
                response = URL( "https://api.openweathermap.org/data/2.5/weather?q=$EnterCityEditText&units=metric&APPID=yourapi").readText(Charsets.UTF_8)
            }
            catch (e: Exception)
            {
                response = null
            }
            return response
        }

        override fun onPostExecute(result: String?)
        {
            super.onPostExecute(result)
            try
            {
                //JSON Return Values from the API

                val jsonObj = JSONObject(result)
                val main = jsonObj.getJSONObject("main")
                val sys = jsonObj.getJSONObject("sys")
                val wind = jsonObj.getJSONObject("wind")
                val weather = jsonObj.getJSONArray("weather").getJSONObject(0)

                val updatedAt:Long = jsonObj.getLong("dt")
                val updatedAtText = "Updated at: "+ SimpleDateFormat("dd/MM/yyyy hh:mm a", Locale.ENGLISH).format(Date(updatedAt*1000))
                val temp = main.getString("temp")+"°C"
                val tempMin = "Min Temp: " + main.getString("temp_min")+"°C"
                val tempMax = "Max Temp: " + main.getString("temp_max")+"°C"
                val pressure = main.getString("pressure")
                val humidity = main.getString("humidity")

                val sunrise:Long = sys.getLong("sunrise")
                val sunset:Long = sys.getLong("sunset")
                val windSpeed = wind.getString("speed")
                val weatherDescription = weather.getString("description")

                val address = jsonObj.getString("name")+", "+sys.getString("country")

                /* Populating extracted data into our views */
                findViewById<TextView>(R.id.location_xml_id).text = address
                findViewById<TextView>(R.id.updated_at_xml_id).text =  updatedAtText
                findViewById<TextView>(R.id.status_xml_id).text = weatherDescription.capitalize()
                findViewById<TextView>(R.id.temperature_xml_id).text = temp
                findViewById<TextView>(R.id.min_temp_xml_id).text = tempMin
                findViewById<TextView>(R.id.max_temp_xml_id).text = tempMax
                findViewById<TextView>(R.id.sunrise).text = SimpleDateFormat("hh:mm a", Locale.ENGLISH).format(Date(sunrise*1000))
                findViewById<TextView>(R.id.sunset).text = SimpleDateFormat("hh:mm a", Locale.ENGLISH).format(Date(sunset*1000))
                findViewById<TextView>(R.id.wind).text = windSpeed
                findViewById<TextView>(R.id.pressure).text = pressure
                findViewById<TextView>(R.id.humidity).text = humidity

                /* Views populated, Hiding the loader, Showing the main design */
                findViewById<ProgressBar>(R.id.loader).visibility = View.GONE
                findViewById<RelativeLayout>(R.id.mainRelativeContainer).visibility = View.VISIBLE

            } catch (e: Exception) {
                findViewById<ProgressBar>(R.id.loader).visibility = View.GONE
                findViewById<TextView>(R.id.ErrorText).visibility = View.VISIBLE
            }

        }
    }
}

activity_manual_search.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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:orientation="vertical"
    android:background="@drawable/gradient_bg"
    tools:context=".ManualSearchActivity">

    <RelativeLayout
        android:id="@+id/mainRelativeContainer"
        android:visibility="visible"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <LinearLayout
            android:id="@+id/locationContainer"
            android:orientation="vertical"
            android:gravity="center"
            android:layout_width="match_parent"
            android:layout_height="wrap_content">

            <TextView
                android:id="@+id/enter_city_text"
                android:text="Enter City Name: "
                android:textSize="25sp"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content" />


            <EditText
                android:id="@+id/enter_city_edit_text"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_below="@+id/enter_city_text"
                android:maxLines="1"
                android:singleLine="true"/>

            <Button
                android:id="@+id/button_search_city"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Search for City"
                android:layout_gravity="center"
                android:layout_below="@+id/enter_city_edit_text"
                android:layout_centerHorizontal="true"
                android:textColor="#ffffff"
                android:background="#0048ff"/>

            <TextView
                android:id="@+id/location_xml_id"
                android:textSize="25sp"
                android:text="Location"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content">
            </TextView>

            <TextView
                android:id="@+id/updated_at_xml_id"
                android:textSize="15sp"
                android:text="Updated at"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content">
            </TextView>


        </LinearLayout>

        <LinearLayout
            android:id="@+id/overviewContainer"
            android:orientation="vertical"
            android:layout_centerInParent="true"
            android:layout_width="match_parent"
            android:layout_height="wrap_content">

            <TextView
                android:id="@+id/status_xml_id"
                android:textSize="35sp"
                android:layout_gravity="center"
                android:text="Clear Sky"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content">
            </TextView>

            <TextView
                android:id="@+id/temperature_xml_id"
                android:textSize="70sp"
                android:fontFamily="sans-serif-thin"
                android:layout_gravity="center"
                android:text="Temperature"
                android:gravity="center"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content">
            </TextView>

            <LinearLayout
                android:id="@+id/temperature_min_max_xml_id"
                android:orientation="horizontal"
                android:gravity="center"
                android:layout_width="match_parent"
                android:layout_height="wrap_content">

                <TextView
                    android:id="@+id/min_temp_xml_id"
                    android:text="Min Temperature"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content">
                </TextView>

                <Space
                    android:layout_width="50dp"
                    android:layout_height="wrap_content">
                </Space>

                <TextView
                    android:id="@+id/max_temp_xml_id"
                    android:text="Max Temperature"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content">
                </TextView>

            </LinearLayout>

        </LinearLayout>

        <LinearLayout
            android:id="@+id/detailsContainer"
            android:orientation="vertical"
            android:layout_alignParentBottom="true"
            android:layout_width="match_parent"
            android:layout_height="wrap_content">
            <LinearLayout
                android:orientation="horizontal"
                android:weightSum="3"
                android:layout_width="match_parent"
                android:layout_height="wrap_content">
                <LinearLayout
                    android:orientation="vertical"
                    android:layout_weight="1"
                    android:gravity="center"
                    android:padding="9dp"
                    android:background="#969696"
                    android:layout_width="0dp"
                    android:layout_height="wrap_content">
                    <ImageView
                        android:layout_width="25dp"
                        android:layout_height="25dp"
                        android:src="@drawable/sunrise"
                        app:tint="#FFF">
                    </ImageView>

                    <Space
                        android:layout_width="wrap_content"
                        android:layout_height="5dp">
                    </Space>

                    <TextView
                        android:textSize="12sp"
                        android:text="Sunrise"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content">
                    </TextView>

                    <TextView
                        android:id="@+id/sunrise"
                        android:textSize="14sp"
                        android:text="AM"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content">
                    </TextView>

                </LinearLayout>
                <Space
                    android:layout_width="10dp"
                    android:layout_height="wrap_content">
                </Space>
                <LinearLayout
                    android:orientation="vertical"
                    android:layout_weight="1"
                    android:gravity="center"
                    android:padding="9dp"
                    android:background="#969696"
                    android:layout_width="0dp"
                    android:layout_height="wrap_content">
                    <ImageView
                        android:layout_width="25dp"
                        android:layout_height="25dp"
                        android:src="@drawable/sunset"
                        app:tint="#FFF">
                    </ImageView>

                    <Space
                        android:layout_width="wrap_content"
                        android:layout_height="5dp">
                    </Space>

                    <TextView
                        android:textSize="12sp"
                        android:text="Sunset"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content">
                    </TextView>

                    <TextView
                        android:id="@+id/sunset"
                        android:textSize="14sp"
                        android:text="PM"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content">
                    </TextView>

                </LinearLayout>
                <Space
                    android:layout_width="10dp"
                    android:layout_height="wrap_content">
                </Space>
                <LinearLayout
                    android:orientation="vertical"
                    android:layout_weight="1"
                    android:gravity="center"
                    android:padding="9dp"
                    android:background="#969696"
                    android:layout_width="0dp"
                    android:layout_height="wrap_content">
                    <ImageView
                        android:layout_width="25dp"
                        android:layout_height="25dp"
                        android:src="@drawable/wind"
                        app:tint="#FFF">
                    </ImageView>

                    <Space
                        android:layout_width="wrap_content"
                        android:layout_height="5dp">
                    </Space>

                    <TextView
                        android:textSize="12sp"
                        android:text="Wind"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content">
                    </TextView>

                    <TextView
                        android:id="@+id/wind"
                        android:textSize="14sp"
                        android:text="Wind"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content">
                    </TextView>

                </LinearLayout>
                <Space
                    android:layout_width="10dp"
                    android:layout_height="wrap_content">
                </Space>

            </LinearLayout>
            <Space
                android:layout_width="wrap_content"
                android:layout_height="10dp"></Space>
            <LinearLayout
                android:orientation="horizontal"
                android:weightSum="3"
                android:layout_width="match_parent"
                android:layout_height="wrap_content">
                <LinearLayout
                    android:orientation="vertical"
                    android:layout_weight="1"
                    android:gravity="center"
                    android:padding="9dp"
                    android:background="#969696"
                    android:layout_width="0dp"
                    android:layout_height="wrap_content">
                    <ImageView
                        android:layout_width="25dp"
                        android:layout_height="25dp"
                        android:src="@drawable/pressure"
                        app:tint="#FFF">
                    </ImageView>

                    <Space
                        android:layout_width="wrap_content"
                        android:layout_height="5dp">
                    </Space>

                    <TextView
                        android:textSize="12sp"
                        android:text="Pressure"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content">
                    </TextView>

                    <TextView
                        android:id="@+id/pressure"
                        android:textSize="14sp"
                        android:text="Pressure"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content">
                    </TextView>

                </LinearLayout>
                <Space
                    android:layout_width="10dp"
                    android:layout_height="wrap_content">
                </Space>
                <LinearLayout
                    android:orientation="vertical"
                    android:layout_weight="1"
                    android:gravity="center"
                    android:padding="9dp"
                    android:background="#969696"
                    android:layout_width="0dp"
                    android:layout_height="wrap_content">
                    <ImageView
                        android:layout_width="25dp"
                        android:layout_height="25dp"
                        android:src="@drawable/humidity"
                        app:tint="#FFF">
                    </ImageView>

                    <Space
                        android:layout_width="wrap_content"
                        android:layout_height="5dp">
                    </Space>

                    <TextView
                        android:textSize="12sp"
                        android:text="Humidity"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content">
                    </TextView>

                    <TextView
                        android:id="@+id/humidity"
                        android:textSize="14sp"
                        android:text="Humidity"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content">
                    </TextView>

                </LinearLayout>
                <Space
                    android:layout_width="10dp"
                    android:layout_height="wrap_content">
                </Space>
                <LinearLayout
                    android:orientation="vertical"
                    android:layout_weight="1"
                    android:gravity="center"
                    android:padding="9dp"
                    android:background="#969696"
                    android:layout_width="0dp"
                    android:layout_height="wrap_content">
                    <ImageView
                        android:layout_width="25dp"
                        android:layout_height="25dp"
                        android:src="@drawable/info"
                        app:tint="#FFF">
                    </ImageView>

                    <Space
                        android:layout_width="wrap_content"
                        android:layout_height="5dp">
                    </Space>

                    <TextView
                        android:textSize="12sp"
                        android:text="Weather Forecast"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content">
                    </TextView>

                    <TextView
                        android:id="@+id/info"
                        android:textSize="14sp"
                        android:text="Next 10 days"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content">
                    </TextView>

                </LinearLayout>
                <Space
                    android:layout_width="10dp"
                    android:layout_height="wrap_content">
                </Space>

            </LinearLayout>
        </LinearLayout>

    </RelativeLayout>

    <ProgressBar
        android:id="@+id/loader"
        android:layout_centerInParent="true"
        android:visibility="gone"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content">

    </ProgressBar>

    <TextView
        android:id="@+id/ErrorText"
        android:layout_centerInParent="true"
        android:text="Error couldn't connect ?"
        android:visibility="gone"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content">

    </TextView>

</RelativeLayout>

Error here: E/AndroidRuntime: FATAL EXCEPTION: main Process: com.example.theweathertoday, PID: 18698 java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.example.theweathertoday/com.example.theweathertoday.ManualSearchActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.pm.ApplicationInfo android.content.Context.getApplicationInfo()' on a null object reference at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3365) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3601) at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:85) at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2066) at android.os.Handler.dispatchMessage(Handler.java:106) at android.os.Looper.loop(Looper.java:223) at android.app.ActivityThread.main(ActivityThread.java:7656) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947) Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.pm.ApplicationInfo android.content.Context.getApplicationInfo()' on a null object reference at android.content.ContextWrapper.getApplicationInfo(ContextWrapper.java:173) at android.view.ContextThemeWrapper.getTheme(ContextThemeWrapper.java:174) at android.content.Context.obtainStyledAttributes(Context.java:744) at androidx.appcompat.app.AppCompatDelegateImpl.createSubDecor(AppCompatDelegateImpl.java:922) at androidx.appcompat.app.AppCompatDelegateImpl.ensureSubDecor(AppCompatDelegateImpl.java:889) at androidx.appcompat.app.AppCompatDelegateImpl.findViewById(AppCompatDelegateImpl.java:691) at androidx.appcompat.app.AppCompatActivity.findViewById(AppCompatActivity.java:264) at com.example.theweathertoday.ManualSearchActivity.<init>(ManualSearchActivity.kt:22) at java.lang.Class.newInstance(Native Method) at android.app.AppComponentFactory.instantiateActivity(AppComponentFactory.java:95) at androidx.core.app.CoreComponentFactory.instantiateActivity(CoreComponentFactory.java:45) at android.app.Instrumentation.newActivity(Instrumentation.java:1253) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3353) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3601)  at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:85)  at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)  at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2066)  at android.os.Handler.dispatchMessage(Handler.java:106)  at android.os.Looper.loop(Looper.java:223)  at android.app.ActivityThread.main(ActivityThread.java:7656)  at java.lang.reflect.Method.invoke(Native Method)  at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947) 

I am trying to pass a value from an edit text to a function, that value is the city name

You can see it inside the URL $EnterCityEditText, I converted the Edit Text entry to String I guess ?

A city name should appear and replace the placeholder value of course

Edit this is the solution, Thanks for David Wasser for hinting

        override fun doInBackground(vararg p0: String?): String?
    {
        var response:String?
        try
        {
            val EnterCityEditText = findViewById<EditText>(R.id.enter_city_edit_text).text.toString()
            response = URL( "https://api.openweathermap.org/data/2.5/weather?q=$EnterCityEditText&units=metric&APPID=yourapi").readText(Charsets.UTF_8)
        }
        catch (e: Exception)
        {
            response = null
        }
        return response
    }

Solution

  • This is your problem:

    val EnterCityEditText: String = findViewById<EditText>(R.id.enter_city_edit_text).text.toString()
    

    You've declared this variable as a member variable in your class. When the instance of the class is instantiated, Android attempts to initialize this variable by calling findViewById(). This fails because the Activity has not yet been completely initialized (onCreate() has not yet been called) and you must also wait until after setContentView() has been called.

    Move the initialization of the variable into onCreate() after you have called setContentView().