Autore Topic: grave problema con findViewById  (Letto 510 volte)

Offline giupardeb

  • Utente junior
  • **
  • Post: 115
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Glaxy Note 4
grave problema con findViewById
« il: 28 Luglio 2015, 15:37:01 CEST »
0
Buon pomeriggio a tutti ragazzi, ho un problema che riguarda questo pezzo di codice:
Codice: [Seleziona]
grid = (GridView) findViewById(R.id.gridView1);
benché l'id gridView1 esista, il valore della variabile grid, è nulla. Di seguito vi mostro il LOGCAT:

Codice: [Seleziona]
07-28 15:31:04.510  15943-15943/? E/AndroidRuntime﹕ FATAL EXCEPTION: main
    Process: com.ppesoft.fotolocation, PID: 15943
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.ppesoft.fotolocation/com.ppesoft.fotolocation.CameraActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.GridView.setAdapter(android.widget.ListAdapter)' on a null object reference
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2694)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2759)
            at android.app.ActivityThread.access$900(ActivityThread.java:178)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1449)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:145)
            at android.app.ActivityThread.main(ActivityThread.java:5944)
            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:1399)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1194)
     Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.GridView.setAdapter(android.widget.ListAdapter)' on a null object reference
            at com.ppesoft.fotolocation.CameraActivity.init(CameraActivity.java:223)
            at com.ppesoft.fotolocation.CameraActivity.onCreate(CameraActivity.java:81)
            at android.app.Activity.performCreate(Activity.java:6289)
            at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1119)
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2647)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2759)
            at android.app.ActivityThread.access$900(ActivityThread.java:178)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1449)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:145)
            at android.app.ActivityThread.main(ActivityThread.java:5944)
            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:1399)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1194)

la linea di codice CameraActivity.java:81, è una chiamata al metodo
Codice: [Seleziona]
init(); che è posto subito dopo il setContentView nel metodo OnCreate() dell'activity principale, mentre la linea di codice CameraActivity.java:223 è l'istruzione
Codice: [Seleziona]
grid.setAdapter(customGridAdapter); all'interno del metodo init();

customGridAdapter è una classe creata per personalizzare il layout del Grid, di cui riporto l'intero codice:
Codice: [Seleziona]
package com.ppesoft.fotolocation;

import java.util.ArrayList;

import android.app.Activity;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.TextView;

public class CustomGridViewAdapter extends ArrayAdapter<TextView>{

        Context context;
        int layoutResourceId;
        ArrayList<TextView> data = new ArrayList<TextView>();

        public CustomGridViewAdapter(Context context, int resource, ArrayList<TextView> data) {
                super(context, resource, data);

                this.context = context;
                layoutResourceId = resource;
                this.data = data;

        }
        @Override
        public View getView(int position, View convertView, ViewGroup parent){
                View row = convertView;
                RecordHolder holder = null;
               
                if (row == null){
                        LayoutInflater inflater = ((Activity) context).getLayoutInflater();
                        row = inflater.inflate(layoutResourceId, parent, false);

                        holder = new RecordHolder();
                        holder.txt = (TextView) row.findViewById(R.id.item_text);
                        row.setTag(holder);
                }
                else holder = (RecordHolder) row.getTag();

                TextView item = data.get(position);
                holder.txt.setText(item.getText());
                return row;
        }
       
        static class RecordHolder{
                TextView txt;
        }
}

Come è possibile tutto ciò?

Spero di essere stato chiaro, preciso e di non aver sbagliato sezione, spero in una risposta che possa risolvermi il problema. Buona giornata a tutti! :)

Offline LinkOut

  • Utente normale
  • ***
  • Post: 272
  • Respect: +38
    • Mostra profilo
  • Dispositivo Android:
    Xiaomi Mi5
Re:grave problema con findViewById
« Risposta #1 il: 28 Luglio 2015, 15:49:29 CEST »
0
Usa

Codice (Java): [Seleziona]
grid = (GridView) findViewById(R.id.gridView1);
dopo

Codice (Java): [Seleziona]
setContentView(R.layout.tuo_layout);

Offline giupardeb

  • Utente junior
  • **
  • Post: 115
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Glaxy Note 4
Re:grave problema con findViewById
« Risposta #2 il: 28 Luglio 2015, 16:04:34 CEST »
0
Purtroppo non è cambiato nulla:

Codice: [Seleziona]
-28 16:03:06.369  19614-19614/com.ppesoft.fotolocation E/Zygote﹕ MountEmulatedStorage()
07-28 16:03:06.369  19614-19614/com.ppesoft.fotolocation E/Zygote﹕ v2
07-28 16:03:06.369  19614-19614/com.ppesoft.fotolocation E/SELinux﹕ [DEBUG] get_category: variable seinfo: default sensitivity: NULL, cateogry: NULL
07-28 16:03:06.559  19614-19614/com.ppesoft.fotolocation E/AndroidRuntime﹕ FATAL EXCEPTION: main
    Process: com.ppesoft.fotolocation, PID: 19614
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.ppesoft.fotolocation/com.ppesoft.fotolocation.CameraActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.GridView.setAdapter(android.widget.ListAdapter)' on a null object reference
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2694)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2759)
            at android.app.ActivityThread.access$900(ActivityThread.java:178)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1449)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:145)
            at android.app.ActivityThread.main(ActivityThread.java:5944)
            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:1399)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1194)
     Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.GridView.setAdapter(android.widget.ListAdapter)' on a null object reference
            at com.ppesoft.fotolocation.CameraActivity.init(CameraActivity.java:224)
            at com.ppesoft.fotolocation.CameraActivity.onCreate(CameraActivity.java:83)
            at android.app.Activity.performCreate(Activity.java:6289)
            at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1119)
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2647)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2759)
            at android.app.ActivityThread.access$900(ActivityThread.java:178)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1449)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:145)
            at android.app.ActivityThread.main(ActivityThread.java:5944)
            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:1399)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1194)

Offline LinkOut

  • Utente normale
  • ***
  • Post: 272
  • Respect: +38
    • Mostra profilo
  • Dispositivo Android:
    Xiaomi Mi5
Re:grave problema con findViewById
« Risposta #3 il: 28 Luglio 2015, 16:06:10 CEST »
0
Allora vuol dire che l'ID della tua GridView non è quello, ovvero non è : gridView1

Guarda che ID ha la tua GridView

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:grave problema con findViewById
« Risposta #4 il: 28 Luglio 2015, 16:09:55 CEST »
0
...esempio: il layout che stai richiamando in setContentView non contiene gridView1, per cui cui grid risulta null.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline giupardeb

  • Utente junior
  • **
  • Post: 115
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Glaxy Note 4
Re:grave problema con findViewById
« Risposta #5 il: 28 Luglio 2015, 16:13:32 CEST »
0
@LinkOut L'ID è quello..altrimenti mi avrebbe dato errore.. comunque sia ho ricontrollato l'ID della GridView ed è quello

Post unito: 28 Luglio 2015, 16:15:34 CEST
@bradipao si il layout che sto richiamando in setContentView non contiene gridView1, gridView1 è il layout di una CustomDialog. Però Non capisco il perché grid risulta null
« Ultima modifica: 28 Luglio 2015, 16:15:34 CEST da giupardeb, Reason: Merged DoublePost »

Offline LinkOut

  • Utente normale
  • ***
  • Post: 272
  • Respect: +38
    • Mostra profilo
  • Dispositivo Android:
    Xiaomi Mi5
Re:grave problema con findViewById
« Risposta #6 il: 28 Luglio 2015, 16:19:57 CEST »
+1
Allora
Codice (Java): [Seleziona]
grid = (GridView) findViewById(R.id.gridView1);Non funzionerà mai perchè la gridView1 non è un elemento del layout che usi facendo setContentView();
Devi accedere a quel ID tramite la View del tuo CustomDialog.

Esempio:
Codice (Java): [Seleziona]
LayoutInflater lf = (LayoutInflater) getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View mView = lf.inflate(R.layout.layout_della_mia_custom_dialog, null);
GridView grid = (GridView) mView.findViewById(R.id.gridView1);
...

Offline giupardeb

  • Utente junior
  • **
  • Post: 115
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Glaxy Note 4
Re:grave problema con findViewById
« Risposta #7 il: 28 Luglio 2015, 16:29:56 CEST »
0
Ottimo..è partito.. non mi dà più l'errore, anche se inspiegabilmente la gridView non si è riempita di textView.. però ora controllo meglio il codice.. Comunque grazie mille. Ti chiedo un ultimo favore, non riesco a capire il perchè debba accedere all'ID gridView1 attraverso la View del mio CustomDialog.

Offline LinkOut

  • Utente normale
  • ***
  • Post: 272
  • Respect: +38
    • Mostra profilo
  • Dispositivo Android:
    Xiaomi Mi5
Re:grave problema con findViewById
« Risposta #8 il: 28 Luglio 2015, 16:57:58 CEST »
0
Perchè nel layout della tua Activity, quello che usi dentro il metodo setContentView(); per intenderci, non contiene la GridView come View avente un id : gridView1.

Non ti da errore il compilatore perchè effettivamente in R.class l'ID c'è... quindi a lui non importa ... Cercando di accedere ad una view tramite getViewById(); tu provi a prendere quella View, castandola a GridView, dal layout dentro setContentView(); dove questa view non esiste.

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:grave problema con findViewById
« Risposta #9 il: 28 Luglio 2015, 17:47:30 CEST »
0
LinkOut ha già spiegato la ragione, comunque ad ulteriore chiarimento: quando tu scrivi findViewById(R.id.gridView1); implicitamente stai scrivendo questa_activity.findViewById(R.id.gridView1);, cioè cerchi gridView1 nel layout correntemente impostato per l'activity. Se vuoi cercarla altrove rispetto all'activity, devi specificare dove, cioè altra_view.findViewById(R.id.gridView1);
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline giupardeb

  • Utente junior
  • **
  • Post: 115
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Glaxy Note 4
Re:grave problema con findViewById
« Risposta #10 il: 28 Luglio 2015, 18:27:09 CEST »
0
perfetto ragazzi.. grazie mille..adesso ho risolto e ho capito dove stava l'errore.. grazie :)