在 android 中将函数返回传递给 textView 时出现问题
我目前正在尝试计算贷款,并希望获得用户需要支付的月费。 计算发生在共享 ViewModel 中,我想将返回值发送到 TextView。
但当应用程序构建视图时,我只会得到一个 Null。不知道如何调用该函数然后显示结果。
AnnuitetViewModel.ktfragment_annuitet_plan.xml
fun getMonthlyPayment(): Double? {
val monthlyInterestRate = annualInterestRate?.div(100)
val x = monthlyInterestRate?.let { loanAmount?.times(it) }
val y =
numberOfYears?.let { Math.pow((1 + annualInterestRate!!).toDouble(), it.toDouble()) }
?.div((Math.pow((1 + annualInterestRate!!).toDouble(), numberOfYears!!.toDouble()) - 1))
val monthlyPayment = y?.let { x?.times(it) }
return monthlyPayment
}
此处描述"
<TextView
android:id="@+id/tvTest4"
android:layout_width="150dp"
android:layout_height="30dp"
android:text="@{`` + viewmodel.monthlyPayment}"
android:textSize="20sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.498"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.79" />
AnnuitetPLanFragment.kt
class AnnuitetPlanFragment : Fragment() {
private var _binding: FragmentAnnuitetPlanBinding? = null
private val binding get() = _binding!!
private lateinit var viewModel: AnnuitetViewModel
private val AnnuitetViewModel: AnnuitetViewModel by activityViewModels()
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?): View? {
_binding = FragmentAnnuitetPlanBinding.inflate(inflater, container, false)
return binding.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
viewModel = ViewModelProvider(this)[AnnuitetViewModel::class.java]
AnnuitetViewModel.antallRenter.observe(viewLifecycleOwner) { progressRenter ->
binding.tvTest.text = progressRenter.toString()
}
AnnuitetViewModel.progressAar.observe(viewLifecycleOwner) { progressAar ->
binding.tvTest2.text = progressAar.toString()
}
AnnuitetViewModel.loanNumber.observe(viewLifecycleOwner) { loanNumber ->
binding.tvTest3.text = loanNumber.toString()
}
binding.tilbakeTilAnnuitet.setOnClickListener {
findNavController().navigate(R.id.action_annuitetPlanFragment_to_annuitetFragment)
}
}
}
I am currently trying to calculate loan and want to get a monthly fee a user need to pay.
The calculation happends in a shared ViewModel and I want to send the return to a TextView.
But I only get a Null when the app build the view. Not sure how to call the function and then display the result.
AnnuitetViewModel.kt
fun getMonthlyPayment(): Double? {
val monthlyInterestRate = annualInterestRate?.div(100)
val x = monthlyInterestRate?.let { loanAmount?.times(it) }
val y =
numberOfYears?.let { Math.pow((1 + annualInterestRate!!).toDouble(), it.toDouble()) }
?.div((Math.pow((1 + annualInterestRate!!).toDouble(), numberOfYears!!.toDouble()) - 1))
val monthlyPayment = y?.let { x?.times(it) }
return monthlyPayment
}
fragment_annuitet_plan.xml
<TextView
android:id="@+id/tvTest4"
android:layout_width="150dp"
android:layout_height="30dp"
android:text="@{`` + viewmodel.monthlyPayment}"
android:textSize="20sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.498"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.79" />
AnnuitetPLanFragment.kt
class AnnuitetPlanFragment : Fragment() {
private var _binding: FragmentAnnuitetPlanBinding? = null
private val binding get() = _binding!!
private lateinit var viewModel: AnnuitetViewModel
private val AnnuitetViewModel: AnnuitetViewModel by activityViewModels()
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?): View? {
_binding = FragmentAnnuitetPlanBinding.inflate(inflater, container, false)
return binding.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
viewModel = ViewModelProvider(this)[AnnuitetViewModel::class.java]
AnnuitetViewModel.antallRenter.observe(viewLifecycleOwner) { progressRenter ->
binding.tvTest.text = progressRenter.toString()
}
AnnuitetViewModel.progressAar.observe(viewLifecycleOwner) { progressAar ->
binding.tvTest2.text = progressAar.toString()
}
AnnuitetViewModel.loanNumber.observe(viewLifecycleOwner) { loanNumber ->
binding.tvTest3.text = loanNumber.toString()
}
binding.tilbakeTilAnnuitet.setOnClickListener {
findNavController().navigate(R.id.action_annuitetPlanFragment_to_annuitetFragment)
}
}
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论