error in fragment when i use FindViewById

66 Views Asked by At

I'm trying to use fragments to not burden my application with too many activities. In my mainActivity there is a map, I then created a fragment where there are editText fields, I would like to use these editText to insert numbers to be used as parameters to pass to a function created in another class called navFun. I tried to write the code but I don't understand why I get these errors when using findViewById:

Unresolved reference: findViewById

this is my fragment code

package uk.co.lorenzopulcinelli.navigationdrawer

import android.os.Bundle
import android.util.Log
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.Button
import android.widget.EditText
import android.widget.Toast
import java.lang.Exception

// TODO: Rename parameter arguments, choose names that match
// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
private const val ARG_PARAM1 = "param1"
private const val ARG_PARAM2 = "param2"

/**
 * A simple [Fragment] subclass.
 * Use the [CreatePathFragment.newInstance] factory method to
 * create an instance of this fragment.
 */
class CreatePathFragment : Fragment() {
    // TODO: Rename and change types of parameters
    private var param1: String? = null
    private var param2: String? = null


    val mainActivity: MainActivity = MainActivity()
    val navFun: NavFun = NavFun(mainActivity.context, mainActivity.mapView)

    private lateinit var editTextLatitudineP1: EditText
    private lateinit var editTextLongitudineP1: EditText
    private lateinit var editTextLatitudineP2: EditText
    private lateinit var editTextLongitudineP2: EditText


    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        arguments?.let {
            param1 = it.getString(ARG_PARAM1)
            param2 = it.getString(ARG_PARAM2)
        }
    }

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {



        // create path between editText points

        editTextLatitudineP1 = findViewById<EditText>(R.id.editTextLatitudineP1)
        editTextLongitudineP1 = findViewById<EditText>(R.id.editTextLongitudineP1)
        editTextLatitudineP2 = findViewById<EditText>(R.id.editTextLatitudineP2)
        editTextLongitudineP2 = findViewById<EditText>(R.id.editTextLongitudineP2)

        val b = findViewById<Button>(R.id.location)
        b.setOnClickListener{
            try {
               Log.d("Path", "Clicked")
               val p1lati: Double = editTextLatitudineP1.text.toString().toDouble()
               val p1long: Double = editTextLongitudineP1.text.toString().toDouble()
               val p2lati: Double = editTextLatitudineP2.text.toString().toDouble()
               val p2long: Double = editTextLongitudineP2.text.toString().toDouble()
               println("latitudine: $p2lati, longitudine: $p2long")
               navFun.routePath(p1lati, p1long, p2lati, p2long)
               mainActivity.mapView.invalidate()
            } catch (e: Exception) {
                Toast.makeText(context, "Error when entering coordinates", Toast.LENGTH_SHORT).show()
            }
        }

        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.fragment_create_path, container, false)
    }

    companion object {
        /**
         * Use this factory method to create a new instance of
         * this fragment using the provided parameters.
         *
         * @param param1 Parameter 1.
         * @param param2 Parameter 2.
         * @return A new instance of fragment CreatePathFragment.
         */
        // TODO: Rename and change types and number of parameters
        @JvmStatic
        fun newInstance(param1: String, param2: String) =
            CreatePathFragment().apply {
                arguments = Bundle().apply {
                    putString(ARG_PARAM1, param1)
                    putString(ARG_PARAM2, param2)
                }
            }
    }
}

and this is my fragment xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
    android:background="@color/white"
    tools:context=".CreatePathFragment"
    android:orientation="vertical">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:text="@string/crea_percorso"
        android:textColor="@color/black"
        android:textSize="40sp"
        android:textStyle="bold" />

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:text="@string/inserisci_le_coordinate_dei_punti_tra_cui_vuoi_creare_un_percorso" />

    <TextView
        android:id="@+id/textView2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:text="@string/latitudine_punto_di_partenza" />

    <EditText
        android:id="@+id/editTextLatitudineP1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:ems="10"
        android:hint="@string/latitudine_p1"
        android:inputType="numberSigned|numberDecimal" />

    <TextView
        android:id="@+id/textView3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:text="@string/longitudine_punto_di_partenza" />

    <EditText
        android:id="@+id/editTextLongitudineP1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:ems="10"
        android:hint="@string/longitudine_p1"
        android:inputType="numberSigned|numberDecimal" />

    <TextView
        android:id="@+id/textView4"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:text="@string/latitudine_punto_di_arrivo" />

    <EditText
        android:id="@+id/editTextLatitudineP2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:ems="10"
        android:hint="@string/latitudine_p2"
        android:inputType="numberSigned|numberDecimal" />

    <TextView
        android:id="@+id/textView5"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:text="@string/longitudine_punto_di_arrivo" />

    <EditText
        android:id="@+id/editTextLongitudineP2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:ems="10"
        android:hint="@string/longitudine_p2"
        android:inputType="numberSigned|numberDecimal" />

    <Button
        android:id="@+id/location"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:text="@string/crea_percorso"
        />

</LinearLayout>
2

There are 2 best solutions below

1
memres On BEST ANSWER
    override fun onCreateView(
    inflater: LayoutInflater, container: ViewGroup?,
    savedInstanceState: Bundle?
): View? {

    val view = inflater.inflate(R.layout.fragment_create_path, container, false)

    // create path between editText points

    editTextLatitudineP1 = view.findViewById<EditText>(R.id.editTextLatitudineP1)
    editTextLongitudineP1 = view.findViewById<EditText>(R.id.editTextLongitudineP1)
    editTextLatitudineP2 = view.findViewById<EditText>(R.id.editTextLatitudineP2)
    editTextLongitudineP2 = view.findViewById<EditText>(R.id.editTextLongitudineP2)

    val b = findViewById<Button>(R.id.location)
    b.setOnClickListener{
        try {
           Log.d("Path", "Clicked")
           val p1lati: Double = editTextLatitudineP1.text.toString().toDouble()
           val p1long: Double = editTextLongitudineP1.text.toString().toDouble()
           val p2lati: Double = editTextLatitudineP2.text.toString().toDouble()
           val p2long: Double = editTextLongitudineP2.text.toString().toDouble()
           println("latitudine: $p2lati, longitudine: $p2long")
           navFun.routePath(p1lati, p1long, p2lati, p2long)
           mainActivity.mapView.invalidate()
        } catch (e: Exception) {
            Toast.makeText(context, "Error when entering coordinates", Toast.LENGTH_SHORT).show()
        }
    }

    // Inflate the layout for this fragment
    return view
}

You must create your view first and than call findViewById on that view.

0
Aiman Qaid On

findViewById will not work inside onCreateView, because at that time the UI is being created, so the views are not initialized yet.

try to link the views inside onViewCreated instead. <-- you can import it using ctrl+O

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)
     
       editTextLatitudineP1 = findViewById<EditText>(R.id.editTextLatitudineP1)

       //.....the rest of your code
    }