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

Unfortunately, Agenda has stopped

Quando aperto o botão para ir para a activity do formulario, o aplicativo fecha e essa mensagem "Unfortunately, Agenda has stopped" é apresentada na tela. Alguma ideia do que pode ser?

12 respostas

Fala ai Pedro, de boa ?

Cara isso acontece quando há alguma exceção no seu código.

Provavelmente o erro está sendo exibido no logcat, consegue mostrar para gente ?

06-04 14:17:03.021 2793-2793/br.com.alura.agenda E/AndroidRuntime: FATAL EXCEPTION: main
    Process: br.com.alura.agenda, PID: 2793
    java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{br.com.alura.agenda/br.com.alura.agenda.FormularioActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.Window$Callback android.view.Window.getCallback()' on a null object reference
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2327)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)
        at android.app.ActivityThread.-wrap11(ActivityThread.java)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loop(Looper.java:148)
        at android.app.ActivityThread.main(ActivityThread.java:5417)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
     Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.Window$Callback android.view.Window.getCallback()' on a null object reference
        at android.support.v7.app.AppCompatDelegateImplBase.<init>(AppCompatDelegateImplBase.java:117)
        at android.support.v7.app.AppCompatDelegateImplV9.<init>(AppCompatDelegateImplV9.java:149)
        at android.support.v7.app.AppCompatDelegateImplV14.<init>(AppCompatDelegateImplV14.java:56)
        at android.support.v7.app.AppCompatDelegateImplV23.<init>(AppCompatDelegateImplV23.java:31)
        at android.support.v7.app.AppCompatDelegate.create(AppCompatDelegate.java:200)
        at android.support.v7.app.AppCompatDelegate.create(AppCompatDelegate.java:183)
        at android.support.v7.app.AppCompatActivity.getDelegate(AppCompatActivity.java:519)
        at android.support.v7.app.AppCompatActivity.findViewById(AppCompatActivity.java:190)
        at br.com.alura.agenda.FormularioHelper.<init>(FormularioHelper.java:17)
        at br.com.alura.agenda.FormularioActivity.<init>(FormularioActivity.java:16)
        at java.lang.Class.newInstance(Native Method)
        at android.app.Instrumentation.newActivity(Instrumentation.java:1067)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2317)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476) 
        at android.app.ActivityThread.-wrap11(ActivityThread.java) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344) 
        at android.os.Handler.dispatchMessage(Handler.java:102) 
        at android.os.Looper.loop(Looper.java:148) 
        at android.app.ActivityThread.main(ActivityThread.java:5417) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

Oi Pedro, pode mostrar sua classe FormularioActivity ?

solução!

Consegui resolver o problema, não sabia desse logCat. O problema era tá usando o FormularioHelper como atributo do FormularioActivity, quando aquele iria ser construido, dava um problema por não ter nada no campo nome, que é obrigatório. Bom, eu acho que era isso. Agora só to com um problema em mostrar o nome do Aluno na lista. Mas acho que é aquele lance de toString do objeto. Não to lembrando muito bem agora

Basta sobreescrever o método toString na classe aluno e dar o comportamento que você quer. :D

A classe aluno tem que estar estendida da Classe Object ou isso é implícito já? Porque esse método toString é da classe Object certo? Ou basta implentar o método da seguinte forma?

public void toString(){
    super(Aluno.nome)
}

Então, toda classe já extende de Object por padrão.

Acho que você ainda não viu alguns cursos que podem te ajudar a aproveitar o máximo desses de android, dá uma olhadinha nos cursos dessa carreira, você vai conseguir aprender bastante coisa: https://cursos.alura.com.br/career/desenvolvedor-java-junior

Eu entendi o lance do método, já o sobrescrevi, mas em vez do nome aparece a seguinte informação: android.support.v7.widget.appCompatEditText{33f007c VFED..CL. ........0,0-480,68 #7f07003d app:id/formulario_nome}

O sobrescrevi da seguinte forma:

public String toString(){
    return getId() + " - " + getNome();
}

o que você tá fazendo no seu helper ?

Provavelmente não tá pegando o texto do edittext.

Assim tá o helper:

package br.com.alura.agenda;

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

import br.com.alura.agenda.modelo.Aluno;

public class FormularioHelper {

   private EditText campoNome;
   private EditText campoEndereco;
   private EditText campoTelefone;
   private EditText campoSite;
   private RatingBar campoNota;

   FormularioHelper(FormularioActivity activity){
        this.campoNome =   activity.findViewById(R.id.formulario_nome);
        this.campoEndereco =  activity.findViewById(R.id.formulario_endereco);
        this.campoTelefone =  activity.findViewById(R.id.formulario_telefone);
        this.campoSite =  activity.findViewById(R.id.formulario_site);
        this.campoNota =  activity.findViewById(R.id.formulario_nota);

    }
    public Aluno pegaAluno(){
        Aluno novo = new Aluno();
        novo.setNome(campoNome.toString());
        novo.setEndereco(campoEndereco.toString());
        novo.setTelefone(campoTelefone.toString());
        novo.setSite(campoSite.toString());
        novo.setNota(Double.valueOf(campoNota.getProgress()));

        return novo;
    }
}

Então, você precisa pegar o texto da sua propriedade:

editText.getText().toString()

Dá forma que você tá fazendo :

editText.toString()

Você tá pegando o toString do objeto EditText que pega a referencia de memoria e tudo mais.

Entendo, agora foi. Muito obrigado pela ajuda o/