3
respostas

Não é mostrada a nota na activity FormularioNotaActivity

Fiz minha implementação utilizando o Parcelable ao invés do Serializable. Mas creio que esse não seja o motivo de não está mostrando a nota quando eu clico em uma para fazer a alteração, eu consigo fazer a alteração da nota, porém no meu formulário não me é mostrada a mesma nota para que eu possa alterá-la, simplesmente fica em branco o formulário, daí eu digito a alteração ali e a mesma é alterada logo depois, mas não tenho o feedback com o nome da nota antiga antes de fazer a alteração. Meu código a FormularioNotaActivity segue abaixo.

package br.com.ceep.ui.activity;

import android.content.Intent;
import android.os.Bundle;
import android.os.Parcelable;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;

import androidx.appcompat.app.AppCompatActivity;

import br.com.ceep.R;
import br.com.ceep.model.Nota;

import static br.com.ceep.ui.activity.NotaActivityConstantes.CHAVE_NOTA;
import static br.com.ceep.ui.activity.NotaActivityConstantes.CODIGO_RESULTADO_NOTA_CRIADA;

public class FormularioNotaActivity extends AppCompatActivity {

    private int posicaoRecebida;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_formulario_nota);

        Intent dadosRecebidos = getIntent();
        if (dadosRecebidos.hasExtra(CHAVE_NOTA) && dadosRecebidos.hasExtra("posicao")){
            Nota notaRecebida = (Nota) dadosRecebidos.getParcelableExtra(CHAVE_NOTA);
            posicaoRecebida = dadosRecebidos.getIntExtra("posicao", -1);
            TextView titulo = findViewById(R.id.formulario_nota_titulo);
            titulo.setText(notaRecebida.getTitulo());
            TextView descricao = findViewById(R.id.formulario_nota_descricao);
            descricao.setText(notaRecebida.getDescricao());
        }
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.menu_formulario_nota_salva, menu);
        return super.onCreateOptionsMenu(menu);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        if (ehMenuSalvaNota(item)){
            Nota nota = criaNota();
            retornaNota(nota);
            finish();
        }
        return super.onOptionsItemSelected(item);
    }

    private void retornaNota(Nota nota) {
        Intent resultadoInsercao = new Intent();
        resultadoInsercao.putExtra(CHAVE_NOTA, nota);
        resultadoInsercao.putExtra("posicao", posicaoRecebida);
        setResult(CODIGO_RESULTADO_NOTA_CRIADA, resultadoInsercao);
    }

    private Nota criaNota() {
        EditText titulo = findViewById(R.id.formulario_nota_titulo);
        EditText descricao = findViewById(R.id.formulario_nota_descricao);
        return new Nota(titulo.getText().toString(), descricao.getText().toString());
    }

    private boolean ehMenuSalvaNota(MenuItem item) {
        return item.getItemId() == R.id.menu_formulario_nota_ic_salva;
    }
}
3 respostas

Continuando com o curso, mesmo com esse pequeno problema, pude perceber que ao colocar um valor padrão de -1 na variável posicaoRecebida no FormulárioNotaActivity, me retornou um erro agora ao tentar alterar uma nota, pois agora da um ArrayIndexOutOfBoundException. Pelo que vejo a posição não está sendo enviada para o Holder. Pelo menos é o que eu deduzir, mas pode ser também outra coisa, vou copiar o erro que recebi logo abaixo.

2019-10-10 10:10:15.763 7851-7851/br.com.ceep E/AndroidRuntime: FATAL EXCEPTION: main
    Process: br.com.ceep, PID: 7851
    java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=2, result=2, data=Intent { (has extras) }} to activity {br.com.ceep/br.com.ceep.ui.activity.ListaNotasActivity}: java.lang.ArrayIndexOutOfBoundsException: length=10; index=-1
        at android.app.ActivityThread.deliverResults(ActivityThread.java:4423)
        at android.app.ActivityThread.handleSendResult(ActivityThread.java:4465)
        at android.app.servertransaction.ActivityResultItem.execute(ActivityResultItem.java:49)
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1831)
        at android.os.Handler.dispatchMessage(Handler.java:106)
        at android.os.Looper.loop(Looper.java:201)
        at android.app.ActivityThread.main(ActivityThread.java:6810)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:547)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:873)
     Caused by: java.lang.ArrayIndexOutOfBoundsException: length=10; index=-1
        at java.util.ArrayList.set(ArrayList.java:455)
        at br.com.ceep.dao.NotaDAO.altera(NotaDAO.java:23)
        at br.com.ceep.ui.activity.ListaNotasActivity.onActivityResult(ListaNotasActivity.java:74)
        at android.app.Activity.dispatchActivityResult(Activity.java:7590)
        at android.app.ActivityThread.deliverResults(ActivityThread.java:4416)
        at android.app.ActivityThread.handleSendResult(ActivityThread.java:4465) 
        at android.app.servertransaction.ActivityResultItem.execute(ActivityResultItem.java:49) 
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108) 
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1831) 
        at android.os.Handler.dispatchMessage(Handler.java:106) 
        at android.os.Looper.loop(Looper.java:201) 
        at android.app.ActivityThread.main(ActivityThread.java:6810) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:547) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:873) 

Professor, fiz alguns testes com o LogCat e descobrir que não está sendo enviada a informação da posição no meu código.

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_formulario_nota);

        Log.i("infoDados", "posicao: " + posicaoRecebida);

        Intent dadosRecebidos = getIntent();

        Log.i("infoDados", "dataHas " + dadosRecebidos.hasExtra("posicao"));

        if (dadosRecebidos.hasExtra(CHAVE_NOTA) && dadosRecebidos.hasExtra("posicao")){
            Nota notaRecebida = dadosRecebidos.getParcelableExtra(CHAVE_NOTA);
            posicaoRecebida = dadosRecebidos.getIntExtra("posicao", -1);
            Log.i("infoDados", "posicao: " + posicaoRecebida);
            TextView titulo = findViewById(R.id.formulario_nota_titulo);
            titulo.setText(notaRecebida.getTitulo());
            TextView descricao = findViewById(R.id.formulario_nota_descricao);
            descricao.setText(notaRecebida.getDescricao());
        }
    }

Obtive como saída essas informações:

2019-10-10 13:00:15.236 27047-27047/br.com.ceep I/infoDados: posicao: 0

2019-10-10 13:00:15.237 27047-27047/br.com.ceep I/infoDados: dataHas false

Será que o problema é por eu estar utilizando o Parcelable ? Parece-me que o putExtra não está enviando a informação da posição.

Clecio, tudo bem ?

Cara na realidade é porque você não está fazendo o set dessa informação.


  if (dadosRecebidos.hasExtra(CHAVE_NOTA) && dadosRecebidos.hasExtra("posicao")){
            Nota notaRecebida = dadosRecebidos.getParcelableExtra(CHAVE_NOTA);
            posicaoRecebida = dadosRecebidos.getIntExtra("posicao", -1);
            Log.i("infoDados", "posicao: " + posicaoRecebida);
            TextView titulo = findViewById(R.id.formulario_nota_titulo);
            titulo.setText(notaRecebida.getTitulo());
            TextView descricao = findViewById(R.id.formulario_nota_descricao);
            descricao.setText(notaRecebida.getDescricao());
        }

Em momento algum você populou o campo de nota