First of all, I'm really a beginner in Kotlin and Android programming, so please excuse me if my question is not very smart.
I'm trying to build an app to keep track of my resources in a board game called Terraforming Mars: Ares Expedition. In the game, each player has 3 types of collectable resources; MC (Money), heat, and plants. To increase stock and income, I've used these colorful buttons to make it similar to the physical game cubes. However, when it comes to spending, I implemented spend buttons for each resource, and a pop-up window appears when it's clicked. I've followed a youtube video to implement the pop-up, and the new class that binds to it.
The problem is, I am unable to update the amount in my main table (stock part of the MC). Here is my pop-up class:
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
}
}
And here is the function "spendMcAmount(amount, actBinding)" I'm trying to run in my MainActivity class.
fun spendMcAmount(amount: Int, binding: ActivityMainBinding) {
mcStock = mcStock-amount
binding.mcStockTv.setText("" mcStock)
}
I have very similar functions to this to increase the MC stock, running when the 1, 5, or 10 buttons are clicked in the MC line. And they work just fine. The only difference is, there is no pop-up windows involved with these buttons, so they are running in the MainActivity class. Here is the function that increases the MC by one:
fun mcOne(view: View) {
mcStock
binding.mcStockTv.setText("" mcStock)
}
I've also tried to set mcStockTextView.text which is in my MainActivity layout, directly from the SpendDialog class, but no luck there either. When I printed the value of mcStockTextView.text, it looks correct, but the display won't show the updated value. Hence, I tried what's in this question, which is creating an object of MainActivity class, and trying to call a function in that class. Still no luck.
Here is a look at my layouts:
CodePudding user response:
you dont need ActivityMainBinding
in the DialogFragment
create an interface
interface SpendListener {
fun onSpend(amount: Int)
}
in the DialogFragment
declare SpendListener
private lateinit var spendListener: SpendListener
public method to initialize the interface
fun setupListener(spendListener: SpendListener) {
this.spendListener = spendListener
}
now before closing your dialog use the interface to send data to the activity
spendListener.onSpend(10)
and in your activity where you're opening the popup, setup a listener to update the UI, after the
dialog.show(this, "TAG")
dialog.setupListener(object: SpendListener {
override fun onSpend(amount: Int) {
yourTextView.text = amount.toString()
}
})