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

Fields nulos

Na aplicação que estou desenvolvendo, ao selecionar um item, o app deveria me redirecionar para uma nova activity, onde os dados do item selecionado seriam exibidos. Porém ocorre um erro, e eu não consigo fazer o set dos dados nos campos da tela, porque as variáveis que criei para receber os campos estão nulas. Por algum motivo, elas não estão sendo inicializadas no construtor do helper.

private SongbookHelper helper;

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

        helper = new SongbookHelper(this);

        Intent intent = getIntent();
        Cantico cantico = (Cantico) intent.getSerializableExtra("cantico");

        if (cantico != null) {
            helper.fillScreen(cantico);
        }

    }
public SongbookHelper(LyricsActivity activity) {
        lyricsField = (EditText) activity.findViewById(R.id.cantico_lyrics);
        titleField = (EditText) activity.findViewById(R.id.cantico_title);
        numberField = (EditText) activity.findViewById(R.id.cantico_number);

        cantico = new Cantico();
    }

public void fillScreen(Cantico cantico){
        numberField.setText(cantico.getNumber().toString());
        titleField.setText(cantico.getTitle());
        lyricsField.setText(cantico.getLyrics());
        this.cantico = cantico;
    }

Alguém saberia me dizer o que estou fazendo errado?

6 respostas

Olá Lucas!

Não consegui perceber nada de errado com o seu código mas o erro pode estar sendo gerado em outro lugar. Posta aqui pra gente a stack trace do erro e também a outra Activity que invoca a LyricsActivity, assim teremos mais informações para poder ajudá-lo!

 protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_summary);

        listaCanticos = (ListView) findViewById(R.id.lista_canticos);

        listaCanticos.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> lista, View item, int position, long id) {
                Cantico cantico = (Cantico) listaCanticos.getItemAtPosition(position);

                Intent intentGoToLyrics = new Intent(SummaryActivity.this, LyricsActivity.class);
                intentGoToLyrics.putExtra("cantico", cantico);
                startActivity(intentGoToLyrics);
            }
        });

    }

Stack Trace:

E/AndroidRuntime: FATAL EXCEPTION: main
                  Process: br.com.ippontadareia.cancioneiroippa, PID: 12983
                  java.lang.RuntimeException: Unable to start activity ComponentInfo{br.com.ippontadareia.cancioneiroippa/br.com.ippontadareia.cancioneiroippa.LyricsActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.EditText.setText(java.lang.CharSequence)' on a null object reference
                      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2325)
                      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387)
                      at android.app.ActivityThread.access$800(ActivityThread.java:151)
                      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303)
                      at android.os.Handler.dispatchMessage(Handler.java:102)
                      at android.os.Looper.loop(Looper.java:135)
                      at android.app.ActivityThread.main(ActivityThread.java:5254)
                      at java.lang.reflect.Method.invoke(Native Method)
                      at java.lang.reflect.Method.invoke(Method.java:372)
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
                   Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.EditText.setText(java.lang.CharSequence)' on a null object reference
                      at br.com.ippontadareia.cancioneiroippa.SongbookHelper.fillScreen(SongbookHelper.java:37)
                      at br.com.ippontadareia.cancioneiroippa.LyricsActivity.onCreate(LyricsActivity.java:28)
                      at android.app.Activity.performCreate(Activity.java:5990)
                      at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1106)
                      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2278)
                      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387) 
                      at android.app.ActivityThread.access$800(ActivityThread.java:151) 
                      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303) 
                      at android.os.Handler.dispatchMessage(Handler.java:102) 
                      at android.os.Looper.loop(Looper.java:135) 
                      at android.app.ActivityThread.main(ActivityThread.java:5254) 
                      at java.lang.reflect.Method.invoke(Native Method) 
                      at java.lang.reflect.Method.invoke(Method.java:372) 
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) 
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) 
Application terminated.

Olá Lucas!

Pelo erro que está acontecendo, algum dos EditText do helper está com a referência nula. Isso pode estar acontecendo porque algum campo não pôde ser encontrado com o findViewById. Dá uma conferida no layout activity_lyrics.xml e compara os IDs dos components com os IDs que estão no helper. Estou imaginando que algum dos IDs deve estar trocado ou deve ter sido definido em uma outra Activity que não a LyricsActivity.

Até isso eu verifiquei e não achei diferença

 <EditText
            android:hint="@+id/cantico_number"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />

        <EditText
            android:hint="@+id/cantico_title"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />

        <EditText
            android:hint="@+id/cantico_lyrics"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />
public SongbookHelper(LyricsActivity activity) {
        lyricsField = (EditText) activity.findViewById(R.id.cantico_lyrics);
        titleField = (EditText) activity.findViewById(R.id.cantico_title);
        numberField = (EditText) activity.findViewById(R.id.cantico_number);

        cantico = new Cantico();
    }
solução!

Olá Lucas!

O problema está nos atributos hint do seu layout que deveriam ser id. Como os elementos não tem id, quando fazemos o findViewById, os objetos não são encontrados e o método devolve sempre null. Tenta fazer a alteração e conte aqui se funcionou!

Era isso mesmo! Não tinha percebido que faltava o atributo id. Muito obrigado