i have 2 fragments, Fragment A which has 2 Text view one text view holds data the sent as an argument from Fragment B, in fragment B i have 2 radio Buttons, data will be sent depends on the selected radio button either Income or expense, then the argument will be set in Income text View, i have a problem here when the user navigate to to add an expense the text in income text will be lost, i have tried ViewModel and used the delegate ActvivityViewModels() but it didn't work, how to retain the text in a text view when navigating back, what is the sulotion for this?.
AddIncomeExpenseFragment.kt
class AddIncomeFragment : Fragment() {
private lateinit var binding : FragmentAddIncomeBinding
private var isChecked = false
@SuppressLint("SetTextI18n")
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
// Inflate the layout for this fragment
val binding = FragmentAddIncomeBinding.inflate(layoutInflater,container,false)
val categories = resources.getStringArray(R.array.categories_array)
val arrayAdapter = ArrayAdapter(
requireContext(),
R.layout.dropdown_item,
categories
)
binding.tvAutoCompleteCategory.setAdapter(arrayAdapter)
val paymentMethods = resources.getStringArray(R.array.payment_methods)
val arrayPaymentAdapter = ArrayAdapter(
requireContext(),
R.layout.dropdown_item,
paymentMethods
)
binding.tvAutoCompletePaymentText.setAdapter(arrayPaymentAdapter)
val calendar = Calendar.getInstance()
val year = calendar.get(Calendar.YEAR)
val month = calendar.get(Calendar.MONTH)
val day = calendar.get(Calendar.DAY_OF_MONTH)
binding.tvDateText.setOnClickListener{
val dpd = DatePickerDialog(requireContext(), { view, mYear, mMonth, mDay ->
binding.tvDateText.text = "$mDay/${mMonth + 1}/$mYear"
}, year, month, day)
dpd.show()
}
binding.btnAdd.setOnClickListener {
if (binding.inputTextAmount.text.isNullOrEmpty()) {
Toast.makeText(requireContext(), "Please enter the amount", Toast.LENGTH_LONG).show()
} else {
if (binding.radioExpense.isChecked) {
val expenseText = binding.inputTextAmount.text.toString().toFloat()
val bundle = Bundle()
bundle.putFloat("expenseText", expenseText)
findNavController().navigate(
R.id.action_addIncomeFragment_to_homeFragment,
bundle
)
}
if (binding.radioIncome.isChecked) {
val incomeText = binding.inputTextAmount.text.toString().toFloat()
val bundle = Bundle()
bundle.putFloat("incomeText", incomeText)
findNavController().navigate(
R.id.action_addIncomeFragment_to_homeFragment,
bundle
)
}
}
}
return binding.root
}
}
HomeFragment.kt
class HomeFragment : Fragment() {
private lateinit var bindingA : FragmentHomeBinding
private val sharedViewModel: SharedViewModel by activityViewModels()
@SuppressLint("SetTextI18n")
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
// Inflate the layout for this fragment
val binding = FragmentHomeBinding.inflate(layoutInflater, container, false)
bindingA = binding
if (arguments == null) {
binding.tvAmountExpense.text = "$00.0"
binding.tvAmountIncome.text = "$00.0"
}
else if(requireArguments().containsKey("expenseText")) {
formatArgumentCurrency("expenseText", binding.tvAmountExpense)
}
else if (requireArguments().containsKey("incomeText")) {
formatArgumentCurrency("incomeText", binding.tvAmountIncome)
}
binding.AddIncomeCard.setOnClickListener{
findNavController().navigate(R.id.action_homeFragment_to_addIncomeFragment)
}
binding.tvAddExpense.setOnClickListener{
findNavController().navigate(R.id.action_homeFragment_to_addExpenseFragment)
}
setupPieChart()
loadPieChartData()
return binding.root
}