I am working on a beginner-level quiz project where I am using Firebase Authentication for login and signup, Firebase Database for storing quiz data, and the Material Design 3 Date Picker for date selection.
The problem is that I am being redirected to QuestionActivity
after data is fetched from the Firebase Database, instead of being redirected based on the date selected.
I have implemented code to ensure that redirection occurs only when a specific date is selected, but despite following the suggested debugging steps, the issue persists.
QuestionActivity.kt:
<code>package com.somethingelse.quiz2
import android.os.Bundle
import androidx.activity.enableEdgeToEdge
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat
import androidx.recyclerview.widget.LinearLayoutManager
import com.google.firebase.firestore.FirebaseFirestore
import com.somethingelse.quiz2.adapters.OptionAdapter
import com.somethingelse.quiz2.databinding.ActivityQuestionBinding
import com.somethingelse.quiz2.models.Questions
import com.somethingelse.quiz2.models.Quiz
class QuestionActivity : AppCompatActivity() {
private lateinit var binding: ActivityQuestionBinding
private var quizzes : MutableList<Quiz>? = null
private var questions : MutableMap<String, Questions>? = null
var index = 1
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
enableEdgeToEdge()
binding = ActivityQuestionBinding.inflate(layoutInflater)
setContentView(binding.root)
setUpFirestore()
ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets ->
val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())
v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom)
insets
}
}
private fun setUpFirestore() {
val firestore = FirebaseFirestore.getInstance()
val date = intent.getStringExtra("DATE")
if (date != null) {
firestore.collection("questions").whereEqualTo("title", date)
.get()
.addOnSuccessListener {
if(it != null && !it.isEmpty){
quizzes = it.toObjects(Quiz::class.java)
questions = quizzes!![0].questions
bindViews()
}
}
}
}
private fun bindViews() {
// Example static question setup. Replace this with dynamic data as needed.
val question = Questions(
"Which is the only bird that can fly backwards",
"Sunbird",
"Kingfisher",
"Honey eater",
"Hummingbird",
"Hummingbird"
)
binding.description.text = question.description
val optionAdapter = OptionAdapter(this, question)
binding.optionList.layoutManager = LinearLayoutManager(this)
binding.optionList.adapter = optionAdapter
binding.optionList.setHasFixedSize(true) // Note the corrected method name
}
}
</code>
<code>package com.somethingelse.quiz2
import android.os.Bundle
import androidx.activity.enableEdgeToEdge
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat
import androidx.recyclerview.widget.LinearLayoutManager
import com.google.firebase.firestore.FirebaseFirestore
import com.somethingelse.quiz2.adapters.OptionAdapter
import com.somethingelse.quiz2.databinding.ActivityQuestionBinding
import com.somethingelse.quiz2.models.Questions
import com.somethingelse.quiz2.models.Quiz
class QuestionActivity : AppCompatActivity() {
private lateinit var binding: ActivityQuestionBinding
private var quizzes : MutableList<Quiz>? = null
private var questions : MutableMap<String, Questions>? = null
var index = 1
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
enableEdgeToEdge()
binding = ActivityQuestionBinding.inflate(layoutInflater)
setContentView(binding.root)
setUpFirestore()
ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets ->
val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())
v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom)
insets
}
}
private fun setUpFirestore() {
val firestore = FirebaseFirestore.getInstance()
val date = intent.getStringExtra("DATE")
if (date != null) {
firestore.collection("questions").whereEqualTo("title", date)
.get()
.addOnSuccessListener {
if(it != null && !it.isEmpty){
quizzes = it.toObjects(Quiz::class.java)
questions = quizzes!![0].questions
bindViews()
}
}
}
}
private fun bindViews() {
// Example static question setup. Replace this with dynamic data as needed.
val question = Questions(
"Which is the only bird that can fly backwards",
"Sunbird",
"Kingfisher",
"Honey eater",
"Hummingbird",
"Hummingbird"
)
binding.description.text = question.description
val optionAdapter = OptionAdapter(this, question)
binding.optionList.layoutManager = LinearLayoutManager(this)
binding.optionList.adapter = optionAdapter
binding.optionList.setHasFixedSize(true) // Note the corrected method name
}
}
</code>
package com.somethingelse.quiz2
import android.os.Bundle
import androidx.activity.enableEdgeToEdge
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat
import androidx.recyclerview.widget.LinearLayoutManager
import com.google.firebase.firestore.FirebaseFirestore
import com.somethingelse.quiz2.adapters.OptionAdapter
import com.somethingelse.quiz2.databinding.ActivityQuestionBinding
import com.somethingelse.quiz2.models.Questions
import com.somethingelse.quiz2.models.Quiz
class QuestionActivity : AppCompatActivity() {
private lateinit var binding: ActivityQuestionBinding
private var quizzes : MutableList<Quiz>? = null
private var questions : MutableMap<String, Questions>? = null
var index = 1
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
enableEdgeToEdge()
binding = ActivityQuestionBinding.inflate(layoutInflater)
setContentView(binding.root)
setUpFirestore()
ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets ->
val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())
v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom)
insets
}
}
private fun setUpFirestore() {
val firestore = FirebaseFirestore.getInstance()
val date = intent.getStringExtra("DATE")
if (date != null) {
firestore.collection("questions").whereEqualTo("title", date)
.get()
.addOnSuccessListener {
if(it != null && !it.isEmpty){
quizzes = it.toObjects(Quiz::class.java)
questions = quizzes!![0].questions
bindViews()
}
}
}
}
private fun bindViews() {
// Example static question setup. Replace this with dynamic data as needed.
val question = Questions(
"Which is the only bird that can fly backwards",
"Sunbird",
"Kingfisher",
"Honey eater",
"Hummingbird",
"Hummingbird"
)
binding.description.text = question.description
val optionAdapter = OptionAdapter(this, question)
binding.optionList.layoutManager = LinearLayoutManager(this)
binding.optionList.adapter = optionAdapter
binding.optionList.setHasFixedSize(true) // Note the corrected method name
}
}
DrawerLayout.kt:
<code>package com.somethingelse.quiz2
import android.content.Intent
import android.os.Bundle
import android.util.Log
import android.view.MenuItem
import android.widget.Toast
import androidx.activity.enableEdgeToEdge
import androidx.appcompat.app.ActionBarDrawerToggle
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat
import androidx.recyclerview.widget.GridLayoutManager
import com.google.android.material.datepicker.MaterialDatePicker
import com.google.firebase.firestore.FirebaseFirestore
import com.somethingelse.quiz2.adapters.QuizAdapter
import com.somethingelse.quiz2.databinding.ActivityDrawerLayoutBinding
import com.somethingelse.quiz2.models.Quiz
import java.text.SimpleDateFormat
import java.util.Date
import java.util.Locale
class DrawerLayout : AppCompatActivity() {
private lateinit var binding: ActivityDrawerLayoutBinding
private lateinit var actionBarDrawerToggle: ActionBarDrawerToggle
private lateinit var firestore: FirebaseFirestore
private lateinit var adapter: QuizAdapter
private var quizList = mutableListOf<Quiz>()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
enableEdgeToEdge()
binding = ActivityDrawerLayoutBinding.inflate(layoutInflater)
setContentView(binding.root)
setupViews()
ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets ->
val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())
v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom)
insets
}
}
private fun setupViews() {
setUpFireStore()
setupDrawerLayout()
setupRecyclerView()
setupDatePicker()
}
private fun setupDatePicker() {
binding.btnDatePicker.setOnClickListener {
val datePicker = MaterialDatePicker.Builder.datePicker()
.setTheme(R.style.ThemeOverlay_App_DatePicker)
.build()
datePicker.show(supportFragmentManager, "DATEPICKER")
datePicker.addOnPositiveButtonClickListener {
val dateFormatter = SimpleDateFormat("dd-MM-yyyy",Locale.UK)
val date = dateFormatter.format(Date(it))
val intent = Intent(this, QuestionActivity::class.java)
intent.putExtra("DATE", date)
startActivity(intent)
}
datePicker.addOnNegativeButtonClickListener {
Log.d("DATEPICKER", datePicker.headerText)
}
datePicker.addOnCancelListener {
Log.d("DATEPICKER", "Date Picker Cancelled")
}
}
}
private fun setUpFireStore() {
firestore = FirebaseFirestore.getInstance()
val collectionReference = firestore.collection("questions")
collectionReference.addSnapshotListener { value, error ->
if(value == null || error != null){
Toast.makeText(this, "Error fetching data", Toast.LENGTH_SHORT).show()
return@addSnapshotListener
}
Log.d("DATA", value.toObjects(Quiz::class.java).toString())
quizList.clear()
quizList.addAll(value.toObjects(Quiz::class.java))
adapter.notifyDataSetChanged()
}
}
private fun setupRecyclerView() {
adapter = QuizAdapter(this, quizList)
binding.quizRecyclerView.layoutManager = GridLayoutManager(this, 2)
binding.quizRecyclerView.adapter = adapter
}
private fun setupDrawerLayout() {
setSupportActionBar(binding.topAppBar)
actionBarDrawerToggle =
ActionBarDrawerToggle(this, binding.main, R.string.open_nav, R.string.close_nav)
actionBarDrawerToggle.syncState()
}
override fun onOptionsItemSelected(item: MenuItem): Boolean {
if (actionBarDrawerToggle.onOptionsItemSelected(item)) {
return true
}
return super.onOptionsItemSelected(item)
}
}
</code>
<code>package com.somethingelse.quiz2
import android.content.Intent
import android.os.Bundle
import android.util.Log
import android.view.MenuItem
import android.widget.Toast
import androidx.activity.enableEdgeToEdge
import androidx.appcompat.app.ActionBarDrawerToggle
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat
import androidx.recyclerview.widget.GridLayoutManager
import com.google.android.material.datepicker.MaterialDatePicker
import com.google.firebase.firestore.FirebaseFirestore
import com.somethingelse.quiz2.adapters.QuizAdapter
import com.somethingelse.quiz2.databinding.ActivityDrawerLayoutBinding
import com.somethingelse.quiz2.models.Quiz
import java.text.SimpleDateFormat
import java.util.Date
import java.util.Locale
class DrawerLayout : AppCompatActivity() {
private lateinit var binding: ActivityDrawerLayoutBinding
private lateinit var actionBarDrawerToggle: ActionBarDrawerToggle
private lateinit var firestore: FirebaseFirestore
private lateinit var adapter: QuizAdapter
private var quizList = mutableListOf<Quiz>()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
enableEdgeToEdge()
binding = ActivityDrawerLayoutBinding.inflate(layoutInflater)
setContentView(binding.root)
setupViews()
ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets ->
val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())
v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom)
insets
}
}
private fun setupViews() {
setUpFireStore()
setupDrawerLayout()
setupRecyclerView()
setupDatePicker()
}
private fun setupDatePicker() {
binding.btnDatePicker.setOnClickListener {
val datePicker = MaterialDatePicker.Builder.datePicker()
.setTheme(R.style.ThemeOverlay_App_DatePicker)
.build()
datePicker.show(supportFragmentManager, "DATEPICKER")
datePicker.addOnPositiveButtonClickListener {
val dateFormatter = SimpleDateFormat("dd-MM-yyyy",Locale.UK)
val date = dateFormatter.format(Date(it))
val intent = Intent(this, QuestionActivity::class.java)
intent.putExtra("DATE", date)
startActivity(intent)
}
datePicker.addOnNegativeButtonClickListener {
Log.d("DATEPICKER", datePicker.headerText)
}
datePicker.addOnCancelListener {
Log.d("DATEPICKER", "Date Picker Cancelled")
}
}
}
private fun setUpFireStore() {
firestore = FirebaseFirestore.getInstance()
val collectionReference = firestore.collection("questions")
collectionReference.addSnapshotListener { value, error ->
if(value == null || error != null){
Toast.makeText(this, "Error fetching data", Toast.LENGTH_SHORT).show()
return@addSnapshotListener
}
Log.d("DATA", value.toObjects(Quiz::class.java).toString())
quizList.clear()
quizList.addAll(value.toObjects(Quiz::class.java))
adapter.notifyDataSetChanged()
}
}
private fun setupRecyclerView() {
adapter = QuizAdapter(this, quizList)
binding.quizRecyclerView.layoutManager = GridLayoutManager(this, 2)
binding.quizRecyclerView.adapter = adapter
}
private fun setupDrawerLayout() {
setSupportActionBar(binding.topAppBar)
actionBarDrawerToggle =
ActionBarDrawerToggle(this, binding.main, R.string.open_nav, R.string.close_nav)
actionBarDrawerToggle.syncState()
}
override fun onOptionsItemSelected(item: MenuItem): Boolean {
if (actionBarDrawerToggle.onOptionsItemSelected(item)) {
return true
}
return super.onOptionsItemSelected(item)
}
}
</code>
package com.somethingelse.quiz2
import android.content.Intent
import android.os.Bundle
import android.util.Log
import android.view.MenuItem
import android.widget.Toast
import androidx.activity.enableEdgeToEdge
import androidx.appcompat.app.ActionBarDrawerToggle
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat
import androidx.recyclerview.widget.GridLayoutManager
import com.google.android.material.datepicker.MaterialDatePicker
import com.google.firebase.firestore.FirebaseFirestore
import com.somethingelse.quiz2.adapters.QuizAdapter
import com.somethingelse.quiz2.databinding.ActivityDrawerLayoutBinding
import com.somethingelse.quiz2.models.Quiz
import java.text.SimpleDateFormat
import java.util.Date
import java.util.Locale
class DrawerLayout : AppCompatActivity() {
private lateinit var binding: ActivityDrawerLayoutBinding
private lateinit var actionBarDrawerToggle: ActionBarDrawerToggle
private lateinit var firestore: FirebaseFirestore
private lateinit var adapter: QuizAdapter
private var quizList = mutableListOf<Quiz>()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
enableEdgeToEdge()
binding = ActivityDrawerLayoutBinding.inflate(layoutInflater)
setContentView(binding.root)
setupViews()
ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets ->
val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())
v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom)
insets
}
}
private fun setupViews() {
setUpFireStore()
setupDrawerLayout()
setupRecyclerView()
setupDatePicker()
}
private fun setupDatePicker() {
binding.btnDatePicker.setOnClickListener {
val datePicker = MaterialDatePicker.Builder.datePicker()
.setTheme(R.style.ThemeOverlay_App_DatePicker)
.build()
datePicker.show(supportFragmentManager, "DATEPICKER")
datePicker.addOnPositiveButtonClickListener {
val dateFormatter = SimpleDateFormat("dd-MM-yyyy",Locale.UK)
val date = dateFormatter.format(Date(it))
val intent = Intent(this, QuestionActivity::class.java)
intent.putExtra("DATE", date)
startActivity(intent)
}
datePicker.addOnNegativeButtonClickListener {
Log.d("DATEPICKER", datePicker.headerText)
}
datePicker.addOnCancelListener {
Log.d("DATEPICKER", "Date Picker Cancelled")
}
}
}
private fun setUpFireStore() {
firestore = FirebaseFirestore.getInstance()
val collectionReference = firestore.collection("questions")
collectionReference.addSnapshotListener { value, error ->
if(value == null || error != null){
Toast.makeText(this, "Error fetching data", Toast.LENGTH_SHORT).show()
return@addSnapshotListener
}
Log.d("DATA", value.toObjects(Quiz::class.java).toString())
quizList.clear()
quizList.addAll(value.toObjects(Quiz::class.java))
adapter.notifyDataSetChanged()
}
}
private fun setupRecyclerView() {
adapter = QuizAdapter(this, quizList)
binding.quizRecyclerView.layoutManager = GridLayoutManager(this, 2)
binding.quizRecyclerView.adapter = adapter
}
private fun setupDrawerLayout() {
setSupportActionBar(binding.topAppBar)
actionBarDrawerToggle =
ActionBarDrawerToggle(this, binding.main, R.string.open_nav, R.string.close_nav)
actionBarDrawerToggle.syncState()
}
override fun onOptionsItemSelected(item: MenuItem): Boolean {
if (actionBarDrawerToggle.onOptionsItemSelected(item)) {
return true
}
return super.onOptionsItemSelected(item)
}
}
- I removed the Date Picker, but the issue remains unresolved.
- I removed the setUpFirestore function from DrawerLayout, and as a result, the data was not fetched.
- I removed the setUpFirestore function from QuestionActivity, but the redirection issue persists.
- I have reviewed the code thoroughly but did not identify any issues.
Recognized by Google Cloud Collective
1