Adam Lee
Adam Lee

Reputation: 576

Android Kotlin: Trying to retrieve the context in a fragment results in type mismatch

I am writing a piece of code that sets the options within a Spinner. Below is my code conected to the fragment:

import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ArrayAdapter
import android.widget.Spinner
import android.widget.TextView
import androidx.fragment.app.Fragment
import androidx.lifecycle.Observer
import androidx.lifecycle.ViewModelProviders
import com.example.alarmeventtest.R

/**
 * A placeholder fragment containing a simple view.
 */
class PlaceholderFragment : Fragment() {

    private lateinit var pageViewModel: PageViewModel

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        pageViewModel = ViewModelProviders.of(this).get(PageViewModel::class.java).apply {
            setIndex(arguments?.getInt(ARG_SECTION_NUMBER) ?: 1)
        }
    }

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        val root = inflater.inflate(R.layout.fragment_main, container, false)

        // UI initialization: Set options of the drop-down menu
        // Set the contents of the drop-down menu (Spinner)
        val spinnerArray =
            arrayOf("All Events", "Your Alarms", "Non-Alarm Events")
        val alarmOptions = root.findViewById<Spinner>(R.id.alarm_viewing_options)
        val adapter = ArrayAdapter(
            context,
            android.R.layout.simple_spinner_item,
            spinnerArray
        )
        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item)
        alarmOptions.adapter = adapter

        return root
    }
}

At this piece of code:

val adapter = ArrayAdapter(
    context,
    android.R.layout.simple_spinner_item,
    spinnerArray
)

In the function:

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

I get the following error:

Type Mismatch: Required: Context Found: Context?

How do I convert context to a non-nullable data type?

Upvotes: 0

Views: 450

Answers (2)

gabber
gabber

Reputation: 41

Use requireContext() instead of context. requireContext() returns a nonnull Context, or throws an exception when one isn't available instead of context.

Upvotes: 0

homerman
homerman

Reputation: 3569

You can instead use requireContext() if you are certain the fragment is associated with a Context (e.g. a valid host Activity), like so:

val adapter = ArrayAdapter(
    requireContext(),
    android.R.layout.simple_spinner_item,
    spinnerArray
)

If the fragment isn't associated with a Context, it will result in an IllegalArgumentException being thrown.

Upvotes: 3

Related Questions