0

So I have this stopwatch but when I open its activity this is what I get:

FATAL EXCEPTION: main
Process: com.reecreate.woderator2, PID: 5869
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.reecreate.woderator2/com.reecreate.woderator2.Controller.StopwatchActivity}: kotlin.UninitializedPropertyAccessException: lateinit property textView has not been initialized
                                                                            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2665)
                                                                            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2726)
                                                                            at android.app.ActivityThread.-wrap12(ActivityThread.java)
                                                                            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1477)
                                                                            at android.os.Handler.dispatchMessage(Handler.java:102)
                                                                            at android.os.Looper.loop(Looper.java:154)
                                                                            at android.app.ActivityThread.main(ActivityThread.java:6119)
                                                                            at java.lang.reflect.Method.invoke(Native Method)
                                                                            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
                                                                            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)
                                                                         Caused by: kotlin.UninitializedPropertyAccessException: lateinit property textView has not been initialized
                                                                            at com.reecreate.woderator2.Controller.StopwatchActivity.onCreate(StopwatchActivity.kt:52)
                                                                            at android.app.Activity.performCreate(Activity.java:6679)
                                                                            at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1118)
                                                                            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2618)
                                                                            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2726) 
                                                                            at android.app.ActivityThread.-wrap12(ActivityThread.java) 
                                                                            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1477) 
                                                                            at android.os.Handler.dispatchMessage(Handler.java:102) 
                                                                            at android.os.Looper.loop(Looper.java:154) 
                                                                            at android.app.ActivityThread.main(ActivityThread.java:6119) 
                                                                            at java.lang.reflect.Method.invoke(Native Method) 
                                                                            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886) 
                                                                            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776) 

This is my code :

class StopwatchActivity : AppCompatActivity() {

lateinit var textView: TextView

lateinit var start: Button

lateinit var pause: Button
lateinit var reset: Button
lateinit var lap: Button

var MillisecondTime: Long = 0
var StartTime:Long = 0
var TimeBuff:Long = 0
var UpdateTime = 0L

lateinit var handler: Handler

var Seconds: Int = 0
var Minutes:Int = 0
var MilliSeconds:Int = 0

lateinit var listView: ListView

var ListElements = arrayOf<String>()

lateinit var ListElementsArrayList: MutableList<String>

lateinit var adapter: ArrayAdapter<String>


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


    textView = textView as TextView
    start = button as Button
    pause = button2 as Button
    reset = button3 as Button
    lap = button4 as Button
    listView = listview1 as ListView

    handler = Handler()

    ListElementsArrayList = ArrayList(Arrays.asList(*ListElements))

    adapter = ArrayAdapter(this,
            android.R.layout.simple_list_item_1,
            ListElementsArrayList
    )

    listView.adapter = adapter

    start.setOnClickListener {
        StartTime = SystemClock.uptimeMillis()
        handler.postDelayed(runnable, 0)

        reset.setEnabled(false)
    }

    pause.setOnClickListener(View.OnClickListener {
        TimeBuff += MillisecondTime

        handler.removeCallbacks(runnable)

        reset.setEnabled(true)
    })

    reset.setOnClickListener(View.OnClickListener {
        MillisecondTime = 0L
        StartTime = 0L
        TimeBuff = 0L
        UpdateTime = 0L
        Seconds = 0
        Minutes = 0
        MilliSeconds = 0

        textView.text = "00:00:00"

        ListElementsArrayList.clear()

        adapter.notifyDataSetChanged()
    })

    lap.setOnClickListener(View.OnClickListener {
        ListElementsArrayList.add(textView.text.toString())

        adapter.notifyDataSetChanged()
    })

}

var runnable: Runnable = object : Runnable {

    override fun run() {

        MillisecondTime = SystemClock.uptimeMillis() - StartTime

        UpdateTime = TimeBuff + MillisecondTime

        Seconds = (UpdateTime / 1000).toInt()

        Minutes = Seconds / 60

        Seconds = Seconds % 60

        MilliSeconds = (UpdateTime % 1000).toInt()

        textView.text = ("" + Minutes + ":"
                + String.format("%02d", Seconds) + ":"
                + String.format("%03d", MilliSeconds))

        handler.postDelayed(this, 0)
    }

}
}

I tried to see exactly what was the problem with my textView, but I didn't see anything that could give it a problem. I mate it private, initialise and all that but I dont know

ANy help would be very appreciated :)

Thanks

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:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.reecreate.woderator2.Controller.StopwatchActivity"
    tools:layout_editor_absoluteX="0dp"
    tools:layout_editor_absoluteY="25dp">

    <TextView
        android:text="00:00:00"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/textView"
        android:textSize="50dp"
        android:textStyle="bold"
        android:textColor="#009688"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true" />

    <Button
        android:text="Start"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/textView"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:layout_marginTop="41dp"
        android:id="@+id/button" />

    <Button
        android:text="Pause"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/button2"
        android:layout_alignBaseline="@+id/button"
        android:layout_alignBottom="@+id/button"
        android:layout_centerHorizontal="true" />

    <Button
        android:text="Reset"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignTop="@+id/button2"
        android:layout_alignParentRight="true"
        android:layout_alignParentEnd="true"
        android:id="@+id/button3" />

    <Button
        android:text="Save Lap"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="24dp"
        android:id="@+id/button4"
        android:layout_below="@+id/button"
        android:layout_centerHorizontal="true" />

    <ListView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_below="@+id/button4"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="12dp"
        android:id="@+id/listview1"/>

</RelativeLayout>

1 Answers1

0

It looks like you're using Kotlin Android Extensions. In this case, you don't have to create the lateinit vars for your Views, you can just refer to their IDs in the XML file.

So instead of this:

class StopwatchActivity : AppCompatActivity() {

    lateinit var textView: TextView

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

        textView = textView as TextView

        textView.text = "00:00:00"
    }

}

Just do this:

class StopwatchActivity : AppCompatActivity() {

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

        textView.text = "00:00:00"
    }

}

And the same with all your other Views.

For options other than Kotlin Android Extensions, see this discussion.

zsmb13
  • 85,752
  • 11
  • 221
  • 226