Передача данных с помощью SharedPreferences
Я создаю в базе данных каталог с клубами, в котором должны храниться id и название клуба:
val ref = FirebaseDatabase.getInstance().reference.child("Clubs")
val clubId = ref.push().key
val clubMap = HashMap<String, Any>()
clubMap["clubId"] = clubId!!
clubMap["clubname"] = name_club.text.toString()
ref.child(clubId).updateChildren(clubMap)
Далее все клубы я помещаю в RecyclerView. Когда я нажимаю по конкретному клубу, я должен попасть в фрагмент этого клуба, передав ему id клуба:
holder.clubLayout.setOnClickListener {
val editor = mContext.getSharedPreferences("PREFS", Context.MODE_PRIVATE).edit()
editor.putString("clubId", club.getClubid())
editor.apply()
(mContext as FragmentActivity).supportFragmentManager
.beginTransaction()
.replace(R.id.clubs_container, ClubFragment()).commit()
}
И в фрагменте я получаю это id:
val preferences = context?.getSharedPreferences("PREFS", Context.MODE_PRIVATE)
if (preferences != null)
{
clubId = preferences.getString("clubId", "none").toString()
}
Далее я хочу получить название клуба с помощью id клуба и записать его в club_fragment_club_name:
private fun clubInfo()
{
val clubsRef = FirebaseDatabase.getInstance().reference.child("Clubs").child(clubId)
clubsRef.addValueEventListener(object : ValueEventListener
{
@RequiresApi(Build.VERSION_CODES.O)
override fun onDataChange(p0: DataSnapshot)
{
if (p0.exists())
{
val club = p0.getValue<Clubs>(Clubs::class.java)
club_fragment_club_name.text = club!!.getClubname()
}
}
override fun onCancelled(error: DatabaseError)
{
}
})
}
Но club_fragment_club_name получается пустым. То есть там нет названия клуба, он просто пустой. В чём может быть проблема?
upd: Когда я попытался id пользователя, то всё было хорошо. То есть проблема не в самой передаче информации, а в id клуба. Но я без понятия, почему это не работает.
Ответы (1 шт):
Вообще на мой взгляд довольно странно использовать для передачи данных в фрагмент функционала для хранения данных приложения. Более логично как мне кажется было бы использовать Bundle в который вы будете класть ваш id. Здесь вы переходите на фрагмент:
(mContext as FragmentActivity).supportFragmentManager
.beginTransaction()
.replace(R.id.clubs_container, ClubFragment()).commit()
можно сделать так:
val clubFrg = ClubFragment()
clubFrg.arguments = Bundle().apply {
putInt("clubId", club.getClubid())
}
(mContext as FragmentActivity).supportFragmentManager
.beginTransaction()
.replace(R.id.clubs_container, clubFrg ).commit()
дальше вы ловите данные в целевом фрагменте:
val clubID = arguments.getInt("clubId")
так же, если все-таки у вас не пробросятся данные, посмотрите в список через логи или отладку, точно ли там есть идентификатор.