Search code examples
androidandroid-studiokotlinfragmentspinner

Android Spinner widget doesn't show text


I want to implement Spinner widget in my app. Text doesn't show in text box of Spinner. And when I selected one item, text doesn't show too.

I ran this project in my android studio. When a fragment created, a text showed in a text box of a spinner widget. And when I select a item, a selected text showed in same text box.

What's different between my project and this project. How I resolve this problem?

SleepRecordFragment.kt


import android.os.Bundle
import android.util.Log
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.AdapterView
import android.widget.ArrayAdapter
import android.widget.Toast
import androidx.fragment.app.Fragment
import com.example.sleeprecorder.R
import com.example.sleeprecorder.databinding.FragmentSleepRecordBinding
import java.util.*

class SleepRecordFragment: Fragment() {
    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        val binding = FragmentSleepRecordBinding.inflate(inflater)

        val daysSize = 7
        val dayList = mutableListOf<String>()
        val calendar = Calendar.getInstance()

        dayList.add(
            calendar.get(Calendar.YEAR).toString() +
                    '/' +
                    calendar.get(Calendar.MONTH).toString() +
                    '/' +
                    calendar.get(Calendar.DAY_OF_MONTH).toString()
        )

        for (i in 0 ..(daysSize - 1) ) {
            calendar.add(Calendar.DAY_OF_YEAR, -1)
            Log.i("SleepRecordFragment", i.toString())
            dayList.add(
                calendar.get(Calendar.YEAR).toString() +
                        '/' +
                        calendar.get(Calendar.MONTH).toString() +
                        '/' +
                        calendar.get(Calendar.DAY_OF_MONTH).toString()
            )
        }

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

        binding.dateSpinner.adapter = adapter






        return binding.root
    }



}

fragment_sleep_record.xml

...
        <Spinner
            android:id="@+id/date_spinner"
            android:layout_width="413dp"
            android:layout_height="48dp"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintHorizontal_bias="1.0"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintVertical_bias="0.0" />
...

Screenshot


Solution

  • Try this

    It worked for me

    class SleepRecordFragment : Fragment() {
    
         private var _binding: FragmentSleepRecordBinding? = null
    
        // This property is only valid between onCreateView and
        // onDestroyView.
        private val binding get() = _binding!!
          override fun onCreateView(
                inflater: LayoutInflater,
                container: ViewGroup?,
                savedInstanceState: Bundle?
            ): View? {
    
                _binding = FragmentSleepRecordBinding.inflate(inflater, container, false)
                return binding.root
    
            }
    
         override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
               super.onViewCreated(view, savedInstanceState)
               val daysSize = 7
               val dayList = mutableListOf<String>()
               val calendar = Calendar.getInstance()
    
               dayList.add(
                   calendar.get(Calendar.YEAR).toString() +
                           '/' +
                           calendar.get(Calendar.MONTH).toString() +
                           '/' +
                           calendar.get(Calendar.DAY_OF_MONTH).toString()
               )
    
               for (i in 0 until daysSize) {
                   calendar.add(Calendar.DAY_OF_YEAR, -1)
                   Log.i("SleepRecordFragment", i.toString())
                   dayList.add(
                       calendar.get(Calendar.YEAR).toString() +
                               '/' +
                               calendar.get(Calendar.MONTH).toString() +
                               '/' +
                               calendar.get(Calendar.DAY_OF_MONTH).toString()
                   )
               }
    
               val adapter = activity?.let {
                   ArrayAdapter(
                       it,
                       android.R.layout.simple_spinner_item,
                       dayList
                   )
               }
    
               binding.dateSpinner.adapter = adapter
           }
    
           override fun onDestroyView() {
               super.onDestroyView()
               _binding = null
           }
       }