3
respostas

Bug no botão de mudar de activity

Concluir todas as aulas de android 1 e estava testando o emulador quando descobrir um bug. quando clico no botão "+" para mudar de activity Lista_Aluno para Formulário o emulador dar a mensagem "Unfortunately, Agenda has stopped" e o aplicativo fecha, quando tento alterar a lista ou apagar o conteúdo dela funciona perfeitamente, mas ao tentar adicionar esse bug acontece.

package com.example.costa.agenda;

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.ContextMenu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;


import com.example.costa.agenda.DAO.AlunoDao;
import com.example.costa.agenda.modelo.Aluno;

import java.util.List;

public class ListaAlunoActivity extends AppCompatActivity {

    private ListView listaAlunos;

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

        listaAlunos = (ListView) findViewById(R.id.lista_alunos);

        listaAlunos.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> lista, View item, int position, long id) {
                Aluno alunos = (Aluno) listaAlunos.getItemAtPosition(position);
                Intent intentVaiProFormulario = new Intent(ListaAlunoActivity.this, FormularioActivity.class);
                intentVaiProFormulario.putExtra("aluno",alunos);
                startActivity(intentVaiProFormulario);
            }
        });

        Button novoAluno = (Button) findViewById(R.id.novo_aluno);
        novoAluno.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intentVaiProFormulario = new Intent(ListaAlunoActivity.this, FormularioActivity.class);
                startActivity(intentVaiProFormulario);
            }
        });

        registerForContextMenu(listaAlunos);
    }

    @Override
    protected void onResume() {
        super.onResume();
        carregarLista();
    }

    @Override
    public void onCreateContextMenu(ContextMenu menu, View v, final ContextMenu.ContextMenuInfo menuInfo) {
        MenuItem deletar = menu.add("Deletar");
        deletar.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
            @Override
            public boolean onMenuItemClick(MenuItem item) {
                AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) menuInfo;
                Aluno aluno = (Aluno) listaAlunos.getItemAtPosition(info.position);

                AlunoDao dao = new AlunoDao(ListaAlunoActivity.this);
                dao.deleta(aluno);
                dao.close();

                carregarLista();
                return false;
            }
        });
    }private void carregarLista() {
        AlunoDao dao = new AlunoDao(this);
        List<Aluno> alunos = dao.buscaAlunos();
        dao.close();


        ArrayAdapter<Aluno> adapter =
                new ArrayAdapter<Aluno>(this,android.R.layout.simple_list_item_1 , alunos);
        listaAlunos.setAdapter(adapter);
    }

}
package com.example.costa.agenda;

import android.widget.EditText;
import android.widget.RatingBar;

import com.example.costa.agenda.modelo.Aluno;

/**
 * Created by costa on 30/03/2017.
 */

public class FormularioAjuda {
    private final EditText campoNome;
    private final EditText campoEndereco;
    private final EditText campoEmail;
    private final EditText campoSite;
    private final EditText campoTelefone;
    private final RatingBar campoNota;
    private Aluno aluno;

    public FormularioAjuda(FormularioActivity activity) {
        campoNome = (EditText) activity.findViewById(R.id.formulario_nome);
        campoEndereco = (EditText) activity.findViewById(R.id.formulario_endereco);
        campoEmail = (EditText) activity.findViewById(R.id.formulario_email);
        campoSite = (EditText) activity.findViewById(R.id.formulario_site);
        campoTelefone = (EditText) activity.findViewById(R.id.formulario_telefone);
        campoNota = (RatingBar) activity.findViewById(R.id.formulario_nota);
        aluno = new Aluno();
    }

    public Aluno pegaAluno() {


        aluno.setNome(campoNome.getText().toString());
        aluno.setEmail(campoEmail.getText().toString());
        aluno.setEndereco(campoEndereco.getText().toString());
        aluno.setNota(Double.valueOf(campoNota.getProgress()));
        aluno.setSite(campoSite.toString());
        aluno.setTelefone(campoTelefone.getText().toString());

        return aluno;
    }

    public void preencherFormulario(Aluno aluno) {
        campoNome.setText(aluno.getNome());
        campoEmail.setText(aluno.getEmail());
        campoEndereco.setText(aluno.getEndereco());
        campoNota.setProgress(aluno.getNota().intValue());
        campoSite.setText(aluno.getSite());
        campoTelefone.setText(aluno.getTelefone());
        this.aluno = aluno;
    }
}
<?xml version="1.0" encoding="utf-8"?>

    <RelativeLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <ListView
            android:id="@+id/lista_alunos"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"/>
        <Button
            android:layout_width="56dp"
            android:layout_height="56dp"
            android:text="+"
            android:textColor="#fff"
            android:textSize="40sp"
            android:elevation="6dp"
            android:layout_alignParentBottom="true"
            android:layout_alignParentRight="true"
            android:layout_marginBottom="16dp"
            android:layout_marginRight="16dp"
            android:background="@drawable/fundo"
            android:stateListAnimator="@null"
            android:id="@+id/novo_aluno"/>

    </RelativeLayout>
3 respostas

Olá Rodrigo,

Isso é só um palpite mas dá uma olhada na sua classe FormularioActivity e verifica o código que preenche o formulário. No onCreate dessa Activity você deve verificar se tem algum aluno vindo na Intent da outra tela e só nesse caso preencher o formulário.

Caso isso não ajude, poste aqui o código da FormularioActivity e também o erro completo que aparece no console para termos uma ideia melhor do que pode ser.

Abaixo se encontra o FormularioActivity

package com.example.costa.agenda;


import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Toast;

import com.example.costa.agenda.DAO.AlunoDao;
import com.example.costa.agenda.modelo.Aluno;

public class FormularioActivity extends AppCompatActivity {

    private FormularioAjuda ajuda;

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

        ajuda = new FormularioAjuda(this);
        Intent intent = getIntent();
        Aluno aluno = (Aluno) intent.getSerializableExtra("aluno");
        if(aluno != null){

        }ajuda.preencherFormulario(aluno);



    }

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

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case R.id.menu_formulario_ok:

                Aluno aluno = ajuda.pegaAluno();
                AlunoDao dao = new AlunoDao(this);
                if(aluno.getId() != null) {
                    dao.altera(aluno);
                }else {
                    dao.insere(aluno);
                }


                dao.close();
                Toast.makeText(FormularioActivity.this, "Aluno " + aluno.getNome() + " salvo", Toast.LENGTH_SHORT).show();
                finish();

                break;
        }
        return super.onOptionsItemSelected(item);
    }
}

Olá Rodrigo,

Como eu comentei o erro se encontra na verificação do aluno que está chegando na Intent:

    Aluno aluno = (Aluno) intent.getSerializableExtra("aluno");
    if(aluno != null){

    }
    ajuda.preencherFormulario(aluno);

Perceba que o método preencherFormulario está fora do if e por isso será sempre invocado, mesmo que o aluno seja null.