首先,我真的是 Kotlin 和 Android 編程的初學者,所以如果我的問題不是很聰明,請見諒。
我正在嘗試構建一個應用程式來跟蹤我在名為 Terraforming Mars: Ares Expedition 的棋盤游戲中的資源。游戲中,每位玩家擁有3種可收集資源;MC(金錢)、熱量和植物。為了增加庫存和收入,我使用了這些彩色按鈕使其類似于物體游戲立方體。但是,在支出方面,我為每個資源實作了支出按鈕,單擊時會出現一個彈出視窗。我已經關注了一個 youtube 視頻來實作彈出視窗以及系結到它的新類。
問題是,我無法更新主表中的金額(MC 的庫存部分)。這是我的彈出課程:
package com.example.aresboard
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.Toast
import androidx.fragment.app.DialogFragment
import com.example.aresboard.databinding.ActivityMainBinding
import com.example.aresboard.databinding.SpendPopupBinding
import java.lang.Integer.parseInt
class SpendDialog : DialogFragment() {
private lateinit var binding: SpendPopupBinding
private lateinit var actBinding: ActivityMainBinding
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
binding = SpendPopupBinding.inflate(layoutInflater)
actBinding = ActivityMainBinding.inflate(layoutInflater)
val view = binding.root
binding.spendButton.setOnClickListener {
var amount = parseInt(binding.howMuch.text.toString())
var mainObject = MainActivity()
mainObject.spendMcAmount(amount, actBinding)
Toast.makeText(context, "You spent $amount", Toast.LENGTH_LONG).show()
dismiss()
}
return view
}
}
這是我試圖在我的 MainActivity 類中運行的函式“spendMcAmount(amount,actBinding)”。
fun spendMcAmount(amount: Int, binding: ActivityMainBinding) {
mcStock = mcStock-amount
binding.mcStockTv.setText("" mcStock)
}
我有與此非常相似的功能來增加 MC 庫存,當在 MC 行中單擊 1、 5 或 10 按鈕時運行。他們作業得很好。唯一的區別是,這些按鈕不涉及彈出視窗,因此它們在 MainActivity 類中運行。這是將 MC 加一的函式:
fun mcOne(view: View) {
mcStock
binding.mcStockTv.setText("" mcStock)
}
我還嘗試直接從 SpendDialog 類設定位于我的 MainActivity 布局中的 mcStockTextView.text ,但那里也沒有運氣。當我列印 mcStockTextView.text 的值時,它看起來是正確的,但顯示屏不會顯示更新后的值。因此,我嘗試了這個問題中的內容,即創建 MainActivity 類的物件,并嘗試呼叫該類中的函式。仍然沒有運氣。
下面是我的布局:
MainActivity 布局
SpendDialog 布局
uj5u.com熱心網友回復:
你不需要ActivityMainBinding在DialogFragment
創建介面
interface SpendListener {
fun onSpend(amount: Int)
}
在DialogFragment宣告中SpendListener
private lateinit var spendListener: SpendListener
初始化介面的公共方法
fun setupListener(spendListener: SpendListener) {
this.spendListener = spendListener
}
現在在關閉對話框之前使用介面將資料發送到活動
spendListener.onSpend(10)
并在您打開彈出視窗的活動中,設定一個偵聽器以更新 UI,之后
dialog.show(this, "TAG")
dialog.setupListener(object: SpendListener {
override fun onSpend(amount: Int) {
yourTextView.text = amount.toString()
}
})
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/428326.html
