从DialogFragment崩溃开始的Fragment中的倒计时



我想创建countdowntimer,可以。正常情况下可以。但是我有一个Dragment,这个片段打开Dialogfragment,如果我点击";是";按钮,则对话框片段应关闭,countdowtimer应在片段中启动。但它崩溃了。我不知道为什么。如果我直接从片段开始countdowntimer,它会工作,但如果我从Dialogfragment开始,它会崩溃。

日志:2022-09-08 19:30:43.470 20162-20162/com.thedgames.rickclicker2 E/AndroidRuntime:致命异常:main流程:com.thedgames.rickclicker2,PID:20162java.lang.NullPointerException网址:com.thedgames.rickclicker2.ui.bank.BankFragment.getBinding(BankFragment.kt:18(访问com.thedgames.rickclicker2.ui.bank.BankFragment.access$getBinding(BankFragment.kt:15(网址:com.thedgames.rickclicker2.ui.bank.BankFragment$timerFun$1.onTick(BankFragment.kt:94(在android.os.CountDownTimer$1.handleMessage(CountDownTimer.java:130(在android.os.Handler.dispatchMessage(Handler.java:106(在android.os.Looper.loop(Looper.java:223(在android.app.ActivityThread.main(ActivityThreads.java:7656(位于java.lang.reflect.Method.ioke(本机方法(网址:com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592(网址:com.android.internal.os.ZygoteInit.main(ZygoteNit.java:947(

有人能帮我吗?

这是我的代码:

BankFragment:

package com.thedgames.rickclicker2.ui.bank
import android.os.Bundle
import android.os.CountDownTimer
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment
import com.thedgames.rickclicker2.data.Variables
import com.thedgames.rickclicker2.databinding.FragmentBankBinding
import com.thedgames.rickclicker2.dialogs.ExchangeDialog
import com.thedgames.rickclicker2.dialogs.InvestDialog

class BankFragment : Fragment() {
private var _binding: FragmentBankBinding? = null
private val binding get() = _binding!!
companion object {
val KEY_PERCENT = "KEY_PERCENT"
val KEY_ENOUGH = "KEY_ENOUGH"
var enough: Boolean = false
}
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?,
): View {
_binding = FragmentBankBinding.inflate(inflater, container, false)
val root: View = binding.root
binding.textExchangeRate.text = "Rate: ${Variables.userObject.bankExchange}:1"
binding.textInvestRate.text = "${Variables.userObject.bankInvest}% / Minute"
binding.btn50Exchange.setOnClickListener {
openExchangeDialog(50)
}
binding.btn100Exchange.setOnClickListener {
openExchangeDialog(100)
}
binding.btn50Invest.setOnClickListener {
openInvestDialog(50)
}
binding.btn100Invest.setOnClickListener {
openInvestDialog(100)
}
return root
}
override fun onDestroyView() {
super.onDestroyView()
_binding = null
}

fun openInvestDialog(percent: Int) {
val invest = InvestDialog()
invest.isCancelable = false
val bundle = Bundle()
bundle.putInt(KEY_PERCENT, percent)
if (Variables.userObject.coins > 999.0){
enough = true
}
bundle.putBoolean(KEY_ENOUGH, enough)
invest.arguments = bundle
invest.show(requireActivity().supportFragmentManager, "InvestDialog")
}
fun openExchangeDialog(percent: Int) {
val exchangeDialog = ExchangeDialog()
exchangeDialog.isCancelable = false
val bundle = Bundle()
bundle.putInt(KEY_PERCENT, percent)
if (Variables.userObject.coins > 999.0){
enough = true
}
bundle.putBoolean(KEY_ENOUGH, enough)
exchangeDialog.arguments = bundle
exchangeDialog.show(requireActivity().supportFragmentManager, "ExchangeDialog")
}
fun timerFun() {
object: CountDownTimer(20000, 1000) {
override fun onTick(remaining: Long) {
binding.textInvestRate.text = (remaining/1000).toString()
}
override fun onFinish() {
binding.textInvestRate.text = "Claim"
}
}.start()
}
}

InvestDialog:

package com.thedgames.rickclicker2.dialogs
import android.app.Dialog
import android.os.Bundle
import androidx.appcompat.app.AlertDialog
import androidx.fragment.app.DialogFragment
import com.thedgames.rickclicker2.MainActivity
import com.thedgames.rickclicker2.R
import com.thedgames.rickclicker2.data.Variables
import com.thedgames.rickclicker2.databinding.LayoutDialoginvestBinding
import com.thedgames.rickclicker2.databinding.LayoutDialoginvestnotenoughBinding
import com.thedgames.rickclicker2.ui.bank.BankFragment
import com.thedgames.rickclicker2.utils.DataManager

class InvestDialog : DialogFragment() {
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
val percent = arguments?.getInt(BankFragment.KEY_PERCENT)
var enough = arguments?.getBoolean(BankFragment.KEY_ENOUGH)
val mainActivity = activity as MainActivity
val alertDialogBuilder = AlertDialog.Builder(requireActivity(), R.style.DialogTheme)
val view = LayoutDialoginvestBinding.inflate(requireActivity().layoutInflater)
val view2 = LayoutDialoginvestnotenoughBinding.inflate(requireActivity().layoutInflater)
if (enough == true){
alertDialogBuilder.setView(view.root)
} else {
alertDialogBuilder.setView(view2.root)
}

view.btnYes.setOnClickListener {
Variables.userObject.coins -= Variables.userObject.coins * percent!! / 100
mainActivity.updateCoin()
DataManager().saveData(requireContext())
BankFragment.enough = false
BankFragment().timerFun()
this.dismiss()
}
view.btnNo.setOnClickListener {
this.dismiss()
}
view2.btnInvestNotEnoughOk.setOnClickListener {
this.dismiss()
}
return alertDialogBuilder.create()
}
}

最好的方法是使用回调接口或更高阶的函数。或如果你想按上面的方式做,请尝试下面的代码

InvestDialog对话框Fragment=新的InvestDialog((;dialogFragment.show(getChildFragmentManager(((;

在对话框中片段:

((BankFragment(getParentFragment(((。timerFun((;

最新更新