Solucionado (ver solução)

Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

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/