Quando vocês fizeram o try/catch do valor para retornar zero quando desse erro, além disso, montei uma estrutura para ele não permitir inserir uma transação com valor zero e mostrar um Toast alertando. Ver uso do método isValid
abaixo
Porém, neste caso, não quero que o dialog feche. Quero que os outros dados que a pessoa já preencheu continuem disponíveis, apenas no aguardo de o preenchimento completo ser feito.
Como fazer isso? Mesmo que minha solução tenha que ser completamente redesenhada...
Segue abaixo meu código atual:
class TransactionsListActivity : AppCompatActivity() {
private var transactions: MutableList<Transaction> = mutableListOf()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_transactions_list)
updateTotals()
configFabAddTransaction()
}
private fun configFabAddTransaction() {
transactions_add_revenue.setOnClickListener {
callTransactionDialog(Type.REVENUE)
}
transactions_add_expense.setOnClickListener {
callTransactionDialog(Type.EXPENSE)
}
}
private fun callTransactionDialog(type: Type) {
TransactionDialog(window.decorView as ViewGroup, this)
.show(type, object : TransactionDelegate {
override fun delegate(transaction: Transaction) {
add(transaction)
}
})
}
private fun updateTotals() {
ViewAbstract(this, window.decorView, transactions).updateTotals()
transactions_listview.adapter = TransactionsListAdapter(transactions,this)
}
private fun add(transaction: Transaction) {
if(isValid(transaction)) {
transactions.add(transaction)
updateTotals()
transactions_add_menu.close(true)
}
}
private fun isValid(transaction: Transaction): Boolean{
val errorMessages = mutableListOf<String>()
if(transaction.value.efEqualsIgnoreScale(BigDecimal.ZERO)){
errorMessages.add(this@TransactionsListActivity.getString(R.string.required_value))
}
if(transaction.value < BigDecimal.ZERO){
errorMessages.add(this@TransactionsListActivity.getString(R.string.negative_value))
}
if(errorMessages.size > 0) {
var fullMessage = ""
if(errorMessages.size == 1) {
fullMessage = errorMessages[0]
}else{
for(message in errorMessages){
fullMessage += "- $message\n"
}
}
Toast.makeText(this@TransactionsListActivity,fullMessage.trim(),Toast.LENGTH_LONG).show()
return false
}
return true
}
}
configuraForm da classe Dialog da transação:
private fun configForm(type: Type, delegate: TransactionDelegate) {
val title = titleByType(type)
AlertDialog.Builder(context)
.setTitle(title)
.setView(dialog)
.setPositiveButton(R.string.add, { _, _ ->
val value = value.text.toString().efParseBigDecimal()
val date = date.text.toString().efParseCalendar(context)
val category = category.selectedItem.toString()
val transaction = Transaction(
type = type,
value = value,
date = date,
category = category)
delegate.delegate(transaction)
})
.setNegativeButton(R.string.cancel, null)
.show()
}
Edit: a comparação direta com ==
do BigDecimal
com Kotlin compila para um .equals()
e não para um .compareTo()
, então ele consideraria valores matematicamente iguais com escalas diferentes como sendo diferentes. Portanto, criei uma extension function que ignora a escala antes de realizar a comparação.