在 android 中将函数返回传递给 textView 时出现问题

发布于 2025-01-15 01:03:10 字数 2790 浏览 3 评论 0原文

我目前正在尝试计算贷款,并希望获得用户需要支付的月费。 计算发生在共享 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.

enter image description here

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文