Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to use an ArrayAdapter in a Fragment with Kotlin

I am trying to to create a Spinner inside a Fragment but I am getting error in the ArrayAdapter constructor call. I don't know why, but it has a red underline. Other than that, there is no error. When I'm using the same ArrayAdapter in an Activity it works, but in a Fragment, it gives an error.

My FirstFragment.kt:

class FirstFragment : Fragment() {

    private var mListener: OnFragmentInteractionListener? = null

    override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        // Inflate the layout for this fragment
        return inflater!!.inflate(R.layout.fragment_first, container, false)
    }

    override fun onViewCreated(view: View?, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        /*Find the id of spinner*/
        val spinner = lol

        /*set an adapter with strings array*/
        spinner.adapter = ArrayAdapter(this, R.layout.support_simple_spinner_dropdown_item, resources.getStringArray(R.array.atoms)) as SpinnerAdapter?

            /*set click listener*/
            spinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener {
            override fun onItemSelected(parent: AdapterView<*>, view: View, position: Int, id: Long) {
                val num = when (spinner.selectedItem.toString()) {
                    "H" -> editText.setText("1")
                    "He" -> editText.setText("4")
                    "C" -> editText.setText("12")
                    "O" -> editText.setText("16")
                    else -> editText.setText("")
                }
            }

            override fun onNothingSelected(parent: AdapterView<*>) {
                /*Do something if nothing selected*/
            }
        }

        button.setOnClickListener {
            if (
                editText2.text.toString().length > 0 &&
                editText.text.toString().length > 0) {
                val num2 = editText.text.toString().toDouble()
                val num1 = editText2.text.toString().toDouble()
                val num = num1/num2
                textView.setText("$num moles")
            }
            else {
                textView.setText("Please Enter a correct value")
            }
        }
    }
}

My fragment_first.xml:

<FrameLayout 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"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    tools:context="com.a3.aakap.ftrial.FirstFragment">

    <android.support.constraint.ConstraintLayout
        android:layout_width="fill_parent"
        android:layout_height="fill_parent">

        <TextView
            android:id="@+id/textView"
            android:layout_width="294dp"
            android:layout_height="80dp"
            android:layout_weight="1"
            android:text="Amswer : No of Moles"
            android:textAlignment="center"
            android:textSize="20sp"
            app:layout_anchorGravity="right|top"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintVertical_bias="0.556" />

        <TextView
            android:id="@+id/textView1"
            android:layout_width="143dp"
            android:layout_height="46dp"
            android:layout_weight="1"
            android:text="Amount in Grams "
            android:textAlignment="center"
            android:textSize="20sp"
            app:layout_anchorGravity="left|bottom"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintHorizontal_bias="0.066"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintVertical_bias="0.305" />

        <Spinner
            android:id="@+id/lol"
            android:layout_width="145dp"
            android:layout_height="57dp"
            app:layout_anchorGravity="left|top"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintHorizontal_bias="0.07"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintVertical_bias="0.136" />

        <Button
            android:id="@+id/button"
            android:layout_width="138dp"
            android:layout_height="43dp"
            android:text="Calculate"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintVertical_bias="0.788" />

        <EditText
            android:id="@+id/editText"
            android:layout_width="148dp"
            android:layout_height="57dp"
            android:ems="10"
            android:hint="Gram"
            android:inputType="numberDecimal|number"
            app:layout_anchorGravity="bottom|center"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintHorizontal_bias="0.762"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintVertical_bias="0.137" />

        <EditText
            android:id="@+id/editText2"
            android:layout_width="148dp"
            android:layout_height="57dp"
            android:ems="10"
            android:hint="Gram"
            android:inputType="numberDecimal|number"
            app:layout_anchorGravity="center_horizontal|center"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintHorizontal_bias="0.716"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintVertical_bias="0.288" />

    </android.support.constraint.ConstraintLayout>

</FrameLayout>
like image 673
a2krocks Avatar asked Jan 18 '18 16:01

a2krocks


People also ask

How to create a simple listview in Kotlin using arrayadapter in Android?

This example demonstrates how to use ArrayAdapter in android to create a simple listview in Kotlin. Step 1 − Create a new project in Android Studio, go to File ⇒New Project and fill all required details to create a new project. Step 2 − Add the following code to res/layout/activity_main.xml. Step 3 − Add the following code to MainActivity.kt

How to send data from one fragment to another using Kotlin?

This example demonstrates how to send data from one Fragment to another using Kotlin. Step 1 − Create a new project in Android Studio, go to File ⇉ New Project and fill all required details to create a new project.

How to create a fragmentactivity in Android Studio?

Step 1 − Create a new project in Android Studio, go to File ⇉ New Project and fill all required details to create a new project. Step 2 − Add the following code to res/layout/activity_main.xml. Step 3 − Create two FragmentActivity and add the codes which are given below.

What is the use of arrayadapter in Android?

It converts data from the data sources into view items that can be displayed into the UI Component. Data Source can be Arrays, HashMap, Database, etc. and UI Components can be ListView, GridView, Spinner, etc. ArrayAdapter is the most commonly used adapter in android.


1 Answers

The problem is in this constructor call:

spinner.adapter = ArrayAdapter(
    this,
    R.layout.support_simple_spinner_dropdown_item,
    resources.getStringArray(R.array.atoms)
) as SpinnerAdapter

The argument this must be a reference to a Context, and a Fragment is not a Context. In an Activity it works because an Activity is a Context.

The solution is to replace this with activity:

spinner.adapter = ArrayAdapter(
    activity,
    R.layout.support_simple_spinner_dropdown_item,
    resources.getStringArray(R.array.atoms)
)
like image 167
Jhon Fredy Trujillo Ortega Avatar answered Oct 12 '22 10:10

Jhon Fredy Trujillo Ortega