Solucionado (ver solução)
Solucionado
(ver solução)
9
respostas

Erro ao passar dados pra outra activity

estou tomando nullpointer, mas nao consegui resolver

 Process: com.example.rafaellara.app, PID: 22423
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.rafaellara.app/com.example.rafaellara.app.activity.FormularioAlunoActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'android.text.Editable android.widget.EditText.getText()' on a null object reference
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2817)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2892)
        at android.app.ActivityThread.-wrap11(Unknown Source:0)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1593)
        at android.os.Handler.dispatchMessage(Handler.java:105)
        at android.os.Looper.loop(Looper.java:164)
        at android.app.ActivityThread.main(ActivityThread.java:6541)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)
     Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.text.Editable android.widget.EditText.getText()' on a null object reference
        at com.example.rafaellara.app.activity.FormularioAlunoActivity.atualizainformacoesdoaluno(FormularioAlunoActivity.java:106)
        at com.example.rafaellara.app.activity.FormularioAlunoActivity.onCreate(FormularioAlunoActivity.java:50)

minha classe

public class FormularioAlunoActivity extends AppCompatActivity implements Delegate {

    private Aluno aluno = new Aluno();
    private EditText campodeNome;
    private EditText campodeemail;
    private Delegate delegate;
    private RatingBar estrela;
    private EditText data;

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {

        if (item.getItemId() == R.id.salvar_aluno_btn) {
            atualizainformacoesdoaluno(aluno);
            persistiraluno();
            delegate.voltapratelaanterior();
        }
        return super.onOptionsItemSelected(item);

    }

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

        configuratela();
        atualizainformacoesdoaluno(aluno);
        Intent dados = getIntent();
        if( dados != null) {

            Aluno aluno = (Aluno) dados.getSerializableExtra("aluno");
            campodeNome.setText(aluno.getNome());
            campodeemail.setText(aluno.getEmail());
            estrela.setProgress(aluno.getEstrela().intValue());
            data.setText(aluno.dataFormatada());
        }

        exibe(new FormularioAlunoFragment(), false);
    }

   private void atualizainformacoesdoaluno(Aluno aluno) {
        aluno.setNome(campodeNome.getText().toString());
        aluno.setEmail(campodeemail.getText().toString());
        aluno.setEstrela(Double.valueOf(estrela.getProgress()));
        aluno.setData(ConversordeData.paraLong(data.getText().toString()));
    }

    private void configuratela() {
        campodeNome = findViewById(R.id.txt_nome);
        campodeemail = findViewById(R.id.txt_email);
        estrela = findViewById(R.id.estrelinha);
        data = findViewById(R.id.data_cadastro);
    }

    private void persistiraluno() {
        BancoDataBase db =  BancoDataBase.getInstance(this);
        AlunoDAO alunoDAO = db.getAlunoDAO();
        if(aluno.getId() == null) {
            alunoDAO.insere(aluno);
            Toast.makeText(this, aluno.getNome()+" Salvo!", Toast.LENGTH_SHORT).show();
        }else {
            alunoDAO.altera(aluno);
            Toast.makeText(this, aluno.getNome()+" Editado!", Toast.LENGTH_SHORT).show();
        }

    }
}
9 respostas

Olá Rafael

O erro esta ocorrendo no método atualizainformacoesdoaluno, você esta tentando acessar uma referência nula, por isto o erro

Só com o código que disponibilizou, não consigo afirmar com certeza qual é o problema. :/

Você pode debugar este método e validar onde esta o problema, ou se preferir, disponibiliza seu código no gitHub, assim consigo verificar pra você, beleza

Bom dia Alessandro, tudo tranquilo?

subi ele do jeito que esta mesmo(to testando varias coisas nesse projeto rsr)

o bo maior agora e so o edita aluno mesmo

https://gitlab.com/RafaelAlmeid/aluno

Ola Rafael, tudo bom?

Cara desculpe a demora, olhei seu projeto no final de semana, tive que pensar um pouco para te dar uma possível solução, sem alterar muito seu projeto e ainda te explicar que fiz kkkkk

Bom, Vamos lá

Você esta recebendo um NullPointerException na classe FormularioAlunoActivity, pois esta tentando acessar algumas views que estão no xml do fragment FormularioAlunoFragment, mas, ele ainda nem foi inflado, logo não está disponível. Uma possível solução, seria você remover os seguintes métodos:

configuratela()
atualizainformacoesdoaluno(aluno);

Oque vai te levar a outras alterações :/

O método exibe, deve passar os dados do aluno para o fragment, e la então, vamos tratar o formulário. Deixei sua classe assim:

public class FormularioAlunoActivity extends AppCompatActivity implements Delegate {

    private Aluno aluno = new Aluno();

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

        Intent dados = getIntent();
        if(dados != null) {
            aluno = (Aluno) dados.getSerializableExtra("aluno");
        }
        exibe(false);
    }

    private void exibe(boolean empilha){
        FormularioAlunoFragment formularioAlunoFragment = new FormularioAlunoFragment();
        FragmentManager gerenciador = getSupportFragmentManager();
        FragmentTransaction transacao = gerenciador.beginTransaction();
        transacao.replace(R.id.aluno_frame, formularioAlunoFragment);

        enviaUsuarioParaFragment(formularioAlunoFragment);

        if(empilha) {
            transacao.addToBackStack(null);
        }
        transacao.commit();
    }

    private void enviaUsuarioParaFragment(Fragment fragment){
        Bundle bundle = new Bundle();
        bundle.putSerializable("aluno", aluno);
        fragment.setArguments(bundle);
    }

//DEMAIS MÉTODOS NÃO FORAM ALTERADOS

Agora vamos para a classe FormularioAlunoFragment, aqui fiz as seguintes alterações:

  • Inclui um FloatingActionButton para adicionar o aluno;
  • Removi o menu e o botão de salvar. Ele estava me dando alguns problemas e achei mais fácil fazer desta forma (Se quiser voltar para o menu, não tem problema, fique a vontade beleza);
  • Alterei o método colocanatelaseforeditar, para que ele só preencha as views, se for uma edição de aluno;
  • Alterei os IDs do arquivo formulario_alunos.xml, pois eles devem ser únicos no app, e você tinha os mesmos ids no xml do professor (Altera isso no seu também, ok);

A classe ficou assim:

public class FormularioAlunoFragment extends Fragment {

    private Aluno aluno;
    private EditText campodeNome;
    private EditText campodeemail;
    private Delegate delegate;
    private RatingBar estrela;
    private EditText data;
    private FloatingActionButton botaoSalvarAluno;

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        delegate = (Delegate) getActivity();
        delegate.trocanome("Cadastro de Aluno");

        setHasOptionsMenu(true);
    }


    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.formulario_alunos, container, false);
        configuratela(view);
        colocanatelaseforeditar();

        botaoSalvarAluno.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                atualizainformacoesdoaluno();
                persistiraluno();

                delegate.voltapratelaanterior();
            }
        });

        return view;
    }

    private void colocanatelaseforeditar() {
        aluno = (Aluno) getArguments().getSerializable("aluno");
        if (aluno != null) {
            campodeNome.setText(aluno.getNome());
            campodeemail.setText(aluno.getEmail());
            estrela.setProgress(aluno.getEstrela().intValue());
            data.setText(aluno.dataFormatada());
        }
        aluno = new Aluno();
        FragmentActivity activity = getActivity();
        activity.setTitle("Editar Aluno");
    }


    private void configuratela(View view) {
        campodeNome = view.findViewById(R.id.txt_nome_aluno);
        campodeemail = view.findViewById(R.id.txt_email_aluno);
        estrela = view.findViewById(R.id.estrelinha_aluno);
        data = view.findViewById(R.id.data_cadastro_aluno);
        botaoSalvarAluno = view.findViewById(R.id.floatingActionButton_aluno);
    }

    private void persistiraluno() {
        BancoDataBase db = BancoDataBase.getInstance(getContext());
        AlunoDAO alunoDAO = db.getAlunoDAO();
        if (aluno.getId() == null) {
            alunoDAO.insere(aluno);
            Toast.makeText(getContext(), aluno.getNome() + " Salvo!", Toast.LENGTH_SHORT).show();
        } else {
            alunoDAO.altera(aluno);
            Toast.makeText(getContext(), aluno.getNome() + " Editado!", Toast.LENGTH_SHORT).show();
        }
    }

    private void atualizainformacoesdoaluno() {
        aluno.setNome(campodeNome.getText().toString());
        aluno.setEmail(campodeemail.getText().toString());
        aluno.setEstrela(Double.valueOf(estrela.getProgress()));
        aluno.setData(ConversordeData.paraLong(data.getText().toString()));
    }

}

Essas alterações vão resolver este problema, mas gostaria de contribuir com alguns pontos, beleza

  • Hoje se você alterar ou Incluir um aluno, a lista não é atualizada (tentei implementar isto, mas precisaria alterar mais código :/ )
  • Os seus campos de data, estão seguindo um padrão dd/MM/yyyy, e se eu não preencher dessa forma, tenho uma exception, seria legal tratar com uma mascara por exemplo.
  • Como esta testando coisas, eu recomendaria utilizar um padrão de arquitetura, assim você vai organizar melhor seu código.

No Android Jetpack você vai encontrar muita coisa legal para testar nos projetos

Espero ter conseguido te ajudar, se tiver algum problema manda aqui

abç

bom dia Alessandro, tudo tranquilo?

mano ajuda da pega tu me deu aqui , eu nao sabia como passar os dados entre as telas nesse modelo que estou usando aqui, porem eu implementei igual tu passou ai, ao clicar no aluno ele leva pra outra tela os dados, porem ao clicar pra salvar/concluir edicao ele nao edita o aluno ele grava outro aluno com os mesmos dados e pega outro id no banco

Tudo tranquilo sim Rafael, e você?

Cara, olhei aqui e tem um erro na minha implementação kkkkkkk

Na classe FormularioAlunoFragment , o método colocanatelaseforeditar, deve ficar assim:

private void colocanatelaseforeditar() {
        aluno = (Aluno) getArguments().getSerializable("aluno");
        if (aluno != null) {
            campodeNome.setText(aluno.getNome());
            campodeemail.setText(aluno.getEmail());
            estrela.setProgress(aluno.getEstrela().intValue());
            data.setText(aluno.dataFormatada());
            delegate.trocanome("Editar Aluno");
        }else {
            aluno = new Aluno();
            delegate.trocanome("Cadastro de Aluno");
        }
    }

Resolvido!!!! valeu mano me ajudou pacas aqui, tu e o cara kkk obg eim, Abraco!

solução!

Legal que consegui te ajudar Rafael. Precisando é só perguntar aqui, beleza

Não esquece de encerrar o tópico

abç