#android #kotlin #android-fragments
#Android #kotlin #android-фрагменты
Вопрос:
Я новичок в Kotlin и Fragments, на самом деле в моем приложении у меня есть два фрагмента: Fragment1 и Fragment2
В первом фрагменте у меня есть метод, который получает данные из некоторых EditTexts и добавляет их в изменяемый список, затем в моем Fragment2 у меня есть ListView, в котором я мог бы показать этот изменяемый список…
Но как я могу передать изменяемый список из фрагмента 1 во фрагмент2?
Вот мой код Fragment1:
private var listArticoli: MutableList<Articolo>? = null
private fun addBarcode(barcode: String, qta: String) {
if (barcode.isEmpty()) {
txtBarcode.requestFocus()
return;
}
listArticoli?.add(Articolo(barcode, qta.toInt()))
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
txtBarcode = view.findViewById(R.id.txtBarcode)
listArticoli = mutableListOf()
btnArticoli.setOnClickListener {
findNavController().navigate(R.id.action_FirstFragment_to_SecondFragment) // button on click of which i navigate to Fragment2
}
}
Фрагмент2 кода:
class SecondFragment : Fragment() {
lateinit var listView: ListView
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_second, container, false)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
listView = view.findViewById(R.id.listView)
view.findViewById<Button>(R.id.btnIndietro).setOnClickListener {
findNavController().navigate(R.id.action_SecondFragment_to_FirstFragment)
}
}
}
Комментарии:
1. используйте
safeargs
для передачи данных между фрагментами, ознакомьтесь с официальными документами для получения дополнительной информации
Ответ №1:
1. Поделитесь viewmodel с их общей родительской активностью
2.FragmentResultListener из фрагмента (после 1.3.0-alpha04)
Ответ №2:
Чтобы получить доступ к изменяемому списку в обоих фрагментах, вы можете создать ViewModel, который состоит из MutableLiveDate требуемого вами типа данных.Затем предоставьте MutableLiveData из viewmodel.Поэтому используйте одну и ту же ViewModel в обоих фрагментах, устанавливая данные из одного фрагмента1 и просматривая данные из фрагмента2.
SampleViewModel.kt
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
class SampleViewModel: ViewModel() {
var mutableLiveData:MutableLiveData<MutableList<Articolo> = MutableLiveData()
}
Fragment1.kt
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment
import androidx.lifecycle.ViewModelProvider
class Fragment1 : Fragment() {
private lateinit var viewModel: SampleViewModel
var arrayList: ArrayList<Articolo> = ArrayList()
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?,
): View? {
return super.onCreateView(inflater, container, savedInstanceState)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
viewModel = ViewModelProvider(requireActivity()).get(SampleViewModel::class.java)
//TODO: Add data to arraylist
viewModel.mutableLiveData.value = arrayList
}
}
Fragment2.kt
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment
import androidx.lifecycle.Observer
import androidx.lifecycle.ViewModelProvider
class Fragment2 : Fragment() {
private lateinit var viewModel: SampleViewModel
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?,
): View? {
return super.onCreateView(inflater, container, savedInstanceState)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
viewModel = ViewModelProvider(requireActivity()).get(SampleViewModel::class.java)
viewModel.mutableLiveData.observe(viewLifecycleOwner, Observer {
//TODO:Can do you requirements here
})
}
}
Комментарии:
1. Привет, Тарун, не мог бы ты привести пример того, как я могу использовать MutableLiveData с массивом моего объекта Articolo?
2. Привет @KasperJuner В соответствии с запрошенным примером. Пожалуйста, проверьте, полезно ли это