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" />
...
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
}
}