Calculando o Total do produto

Prezados bom dia.

Estou dando prosseguimento a um projeto que faz pedido, me deparei com formatação monetária no EditText e pesquisando consegui achar uma classe e ta funcionando tranquilo aplicando a formatação nos campos de Valor unitário e Desconto.

Minha duvida deve ser daquelas bem basica mais não estou conseguindo passar adiante, com certeza deve esta me faltando o fundamental do java.

Bem no layout tenho três componentes Valor Unitário, Valor Total, Quantidade e Desconto sendo estes dois ultimos habilitados para o usuário então preciso calcular o valor Total e já consigo fazer isto porque apliquei no componente Quantidade o evento
edtQtd.addTextChangedListener(new TextWatcher()

mais no desconto eu já tenho o Listener porque tive que aplicar a mascara
edtDesconto.addTextChangedListener(MaskMonetaria.insert(edtDesconto))

como posso ter outro Listener com um proposito de calcular o valor Total ?

Ola,

Provavelmente, essa classe que você está usando deve ter um método que remova a mascara. Nisso você consegue converter a String para o wrapper Double, por exemplo. Disso você consegue fazer a conta e depois é só prosseguir.

Pelo que entendi é o que você quer né ?

Olá Matheus boa noite!

Prezado obrigado ai pela interação mais vamos lá, no campo Quantidade eu não tenho nenhum listener de formatação então usei ele para calcular o valor total exemplo digitando no campo qtd:
Qtd Op Unitario Op Desconto = Total
5 x R$ 20,00 - R$0,00 = R$100,00 Ok certo?
Agora o campo desconto ele já tem um Listener que uso para formata-lo então não tenho como ( ou não sei como fazer ) para usar a formatação monetária porque isto é necessário e ao mesmo tempo calcular o valor total

Resumindo não da pra fazer duas coisas ao mesmo tempo no mesmo Listener

qual é a formatação que vc está utilizando?

Olá Junior boa noite!

Então eu uso a classe MaskMonetaria ( em anexo ) para dar a formatação na caixa de texto enquanto o usuário digita
MaskMonetaria.java (2.0 KB)

na activity…

edtDesconto = (EditText) findViewById(R.id.edtDesconto); edtTotal = (EditText) findViewById(R.id.edtTotal); edtUnitario.addTextChangedListener(MaskMonetaria.insert(edtUnitario)); edtDesconto.addTextChangedListener(MaskMonetaria.insert(edtDesconto)); edtTotal.addTextChangedListener(MaskMonetaria.insert(edtTotal));

como pode ver tenho já um listener para o campo o objeto edtDesconto que sua finalidade é colocar o simbolo R$ seguido do valor digitado exemplo R$10,00

Bom dia, pelo que entendi, você não está conseguindo calcular devido a máscara aplicada com R$.
Se for isso, você pode remover o ‘R$’ do campo e calcular.

Assim:

int quantidade = Integer.parseInt(edtQtd.getText().toString());
double unitario = Double.parseDouble(edtUnitario.getText().toString().replace("R$", ""));
double desconto = Double.parseDouble(edtDesconto.getText().toString().replace("R$", ""));
double total = (quantidade * unitario) - desconto;

Olá Junior bom dia.

Então, a mascara ou seja o R$ num é problema uma vez que no campo quantidade eu já faço uso de um listener que calcula o total

`edtQtd.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) { }

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
            calculaTotais();
        }

        @Override
        public void afterTextChanged(Editable s) { }
    });`

talvez eu não esteja conseguindo passar o problema, mais note que o campo desconto já tem um listener que é para aplicar a formatação

edtDesconto.addTextChangedListener(MaskMonetaria.insert(edtDesconto));

então como posso chamar o meu método calculaTotais quando o usuário digitar algo neste campo uma vez que o .addTextChangedListener já esta sendo usado?

Entendi, tente o seguinte:

TextWatcher watcher = new TextWatcher(){
 
    @Override 
    public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
    } 
 
    @Override 
    public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
    } 
 
    @Override 
    public void afterTextChanged(Editable editable) {
      edtDesconto.addTextChangedListener(MaskMonetaria.insert(edtDesconto));
      calculaTotais();
    } 
};

então:

edtDesconto.addTextChangedListener(watcher);

Olá bom dia!

Junior achei uma boa ideia mais a classe que uso para a mascara ela retorna um new TextWatcher(), o código que vc sugeriu ele é um TextWatcher.

bem causou um erro, o aplicativo parou, chegou a calcular o valor total com o desconto mais causou um erro apontando para a classe MaskMonetaria na linha do ediTxt
str = nf.format(Double.parseDouble(str) / 100); ediTxt.setText(str);

Acho que não tem como, o jeito para este objeto é abandonar a classe MaskMonetaria ( que como é uma classe a ideia é usar em qualquer objeto mais como preciso ir alem ou seja ter a mascara e também chamar um método) e fazer o código da mesma no objeto.