Saving state on navigation

Viewed 18

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 
  
     }
0 Answers
Related