Autore Topic: inflate e runtime exception al cambio di activity  (Letto 791 volte)

Offline N4tty

  • Nuovo arrivato
  • *
  • Post: 13
  • Respect: 0
    • Mostra profilo
    • While(1) QI++;
  • Sistema operativo:
    ArchLinux
inflate e runtime exception al cambio di activity
« il: 27 Aprile 2012, 01:15:49 CEST »
0
Ho 3 errori nel logcat che non riesco a "decifrare".
Ho una semplice activity, che al tasto di un pulsante fa partire una seconda activity.
Le activity sono rispettivamente
Codice (Java): [Seleziona]
public class Tre7 extends Activity implements OnClickListener {
   
        /** attributi bottoni */
        private Button nuova, carica, trucchi;
       
        /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
       
        /** acquisisco risorse dei bottoni */
        nuova = (Button) findViewById(R.id.new_play);
        carica = (Button) findViewById(R.id.load_play);
        trucchi = (Button) findViewById(R.id.cheat);
       
        /** associo i bottoni al gestore */
        nuova.setOnClickListener(this);
        carica.setOnClickListener(this);
        trucchi.setOnClickListener(this);
    }

        public void onClick(View v) {
                /** switch sull'id del pulsante, un azione diversa per ogni bottone */
                switch(v.getId()) {
               
                case R.id.new_play:
                        /** passa all'activity che crea una nuova partita */
                Intent i = new Intent(this, Tre7StartPlay.class);
                startActivity(i);
                break;
               
                }
        }
   
}

Codice (Java): [Seleziona]
public class Tre7StartPlay extends Activity implements OnItemClickListener {
       
        /** attributi del core del gioco, come il mazzo, il giocatore, la cpu */
        private Mazzo mazzo;
        private Giocatore player;
        private Cpu computer;
       
        /** stato true il giocatore deve tirare, stato false si rimuovono le carte dal terreno di gioco */
        private boolean stato = true;
       
        /** tira = 0 il giocatore tira per primo, tira = 1 tira per primo la cpu */
        private int tira = 0;
       
        /** attributi sincronizzatori tra liste e textView
         * in ordine pescate, tavolo e card */

        private ArrayList<String> mArrayPescate, mArrayTavolo, mArrayCard;
        private ArrayAdapter<String> mArrayPescateAdapter, mArrayTavoloAdapter, mArrayCardAdapter;
       
        /** start activity */
        public void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.match);
               
                /** oggetti della partita più layout UI */
                player = new Giocatore("pippo");
                computer = new Cpu(2);
                mazzo = new Mazzo(player, computer);
                GridView carteATavolo = (GridView) findViewById(R.id.tavoloCarte);
                GridView list = (GridView) findViewById(R.id.cartePlayer);
                GridView carteDaPescare = (GridView) findViewById(R.id.tavoloMazzo);
               
                /** array adattatore carte del giocatore */
                mArrayCard = new ArrayList<String>();
                for(int j=0;j<4;j++)for(int i=0;i<10;i++) if(player.carteInMano.get(i).getSeme() == j) mArrayCard.add(player.carteInMano.get(i).getName());
                mArrayCardAdapter = new ArrayAdapter<String>(this, R.layout.cards, R.id.carta, mArrayCard);
                list.setAdapter(mArrayCardAdapter);
                list.setOnItemClickListener(this);
               
                /** array adattatore carte sul tavolo */
                mArrayTavolo = new ArrayList<String>();
                mArrayTavoloAdapter = new ArrayAdapter<String>(this, R.layout.cards, R.id.carta, mArrayTavolo);
                carteATavolo.setAdapter(mArrayTavoloAdapter);
               
                /** array adattatore carte pescate */
                mArrayPescate = new ArrayList<String>();
                mArrayPescate.add("mazzo");
                mArrayPescateAdapter = new ArrayAdapter<String>(this, R.layout.cards, R.id.carta, mArrayPescate);
                carteDaPescare.setAdapter(mArrayPescateAdapter);
                carteDaPescare.setOnItemClickListener(this);
        }
       
        /** listener su carte del giocatore e mazzo */
        public void onItemClick(AdapterView<?> adapter, View v, int position, long id) {
                // TODO Auto-generated method stub
                GridView g = (GridView) adapter.getAdapter();
               
                /** click sul mazzo */
                if(g.getId()== R.id.tavoloMazzo) {
                       
                        /** se il giocatore ha già tirato */
                        if(stato == false) {
                       
                                /** aggiorno l'UI eliminando le carte da tavolo, aggiungo poi la carta tirata dalla cpu se ha preso lei la mano precedente */
                                mArrayTavolo.clear();
                                if(tira == 1 && computer.carteInMano.size()>0) mArrayTavolo.add(computer.tiraCarta(computer.rispondi()).getName());
               
               
                                /** aggiungo carta pescata in mano al giocatore ed elimino le carte pescate dalla view */
                                if(mArrayPescate.size()>0) {
                                        mArrayCard.add(mArrayPescate.get(tira));
                                        mArrayPescate.remove(1);
                                        mArrayPescate.remove(2);
                                }
                               
               
                                /** aggiorno l'UI */
                                mArrayCardAdapter.notifyDataSetChanged();
                                mArrayTavoloAdapter.notifyDataSetChanged();
                                mArrayPescateAdapter.notifyDataSetChanged();
               
                                /** se il giocatore non ha più carte in mano, finesce la partita e viene invocata
                                 * l'activity con il punteggio finale dell'utente */

                                if(player.carteInMano.size() == 0) {
                       
                                        /** viene passata all'intent il punteggio dell'utente e viene eseguita */
                                        Intent i = new Intent(this, Tre7EndPlay.class);
                                        i.putExtra("punteggio", (int)player.getPoints());
                                        startActivity(i);
                                }
                                /** ritocca al giocatore tirare */
                                stato = true;
                        }
                       
                /** click su una carta */
                } else if(g.getId() == R.id.cartePlayer) {
                        /** se tocca al giocatore tirare */
                        if(stato == true) {
                       
                                String          nomeCarta = mArrayCard.get((int)id);
                                String[]        infoCarta = nomeCarta.split(" ");
                                int[]           identifier = { 0, 0 };
                                Carta           cartaP, cartaC;
                       
                                /** calcolo id carta tirata */
                                if(infoCarta[0].equals("quattro")) identifier[0] = 0;
                                if(infoCarta[0].equals("cinque")) identifier[0] = 1;
                                if(infoCarta[0].equals("sei")) identifier[0] = 2;
                                if(infoCarta[0].equals("sette")) identifier[0] = 3;
                                if(infoCarta[0].equals("fante")) identifier[0] = 4;
                                if(infoCarta[0].equals("cavallo")) identifier[0] = 5;
                                if(infoCarta[0].equals("re")) identifier[0] = 6;
                                if(infoCarta[0].equals("asso")) identifier[0] = 7;
                                if(infoCarta[0].equals("due")) identifier[0] = 8;
                                if(infoCarta[0].equals("tre")) identifier[0] = 9;
       
                                if(infoCarta[2].equals("denari")) identifier[1] = 0;
                                if(infoCarta[2].equals("coppe")) identifier[1] = 1;
                                if(infoCarta[2].equals("bastoni")) identifier[1] = 2;
                                if(infoCarta[2].equals("spade")) identifier[1] = 3;
                       
                                /** carta tirata dall'utente */
                                cartaP = new Carta(identifier[1]*10+identifier[0]);
                       
                                /** se ha tirato per primo l'utente */
                                if(tira == 0) {
                               
                                        /** creo la carte risposta della cpu */
                                        cartaC = computer.rispondi(cartaP);
                               
                                        /** la cpu ha tirato per primo, la carta è già stata creata ed è a terra */
                                } else {
                               
                                        String          nome = mArrayTavolo.get(0);
                                        String[]        info = nome.split(" ");
                                        int[]           ide = {0, 0};
                                       
                                        /** calcolo carta tirata dalla cpu */
                                        if(info[0].equals("quattro")) ide[0] = 0;
                                        if(info[0].equals("cinque")) ide[0] = 1;
                                        if(info[0].equals("sei")) ide[0] = 2;
                                        if(info[0].equals("sette")) ide[0] = 3;
                                        if(info[0].equals("fante")) ide[0] = 4;
                                        if(info[0].equals("cavallo")) ide[0] = 5;
                                        if(info[0].equals("re")) ide[0] = 6;
                                        if(info[0].equals("asso")) ide[0] = 7;
                                        if(info[0].equals("due")) ide[0] = 8;
                                        if(info[0].equals("tre")) ide[0] = 9;
               
                                        if(info[2].equals("denari")) ide[1] = 0;
                                        if(info[2].equals("coppe")) ide[1] = 1;
                                        if(info[2].equals("bastoni")) ide[1] = 2;
                                        if(info[2].equals("spade")) ide[1] = 3;
                               
                                        /** carta tirata dal computer appena creata */
                                        cartaC = new Carta(ide[1]*10+ide[0]);
                               
                                        /** se la carta scelta dall'utente non risponde al seme di quella tirata dalla cpu
                                         * ed il giocatore ha carte in mano di quel seme vanifico il click sulla carta */

                                        //if((cartaC.getSeme() != cartaP.getSeme()) && (player.carteDisponibili(cartaC.getSeme()).size() > 0)) return;
                                }
                               
                                /** tolgo le due carte tirate dai giocatori dalle loro mani */
                                player.tiraCarta(cartaP);
                                computer.tiraCarta(cartaC);
                               
                                /** mostro carte pescate */
                                /** a seconda di chi prende assegno le carte ed i punti */
                                /** prende l'utente */
                                if((cartaP.getPower() > cartaC.getPower() && cartaC.getSeme() == cartaP.getSeme()) || (tira==0 && cartaP.getSeme() != cartaC.getSeme())) {
                                        /** assegna le carte se ci sono ancora nel mazzo */
                                        if(mazzo.carteNelMazzo.size() > 0) {
                                                mArrayPescate.add(mazzo.assegnaCarte(player, 1).getName());
                                                mArrayPescate.add(mazzo.assegnaCarte(computer, 1).getName());
                                        }
                                        /** tocca all'utente il prossimo tiro */
                                        tira = 0;
                                        player.assegnaPunti(cartaP, cartaC);
                               
                                /** prende la cpu */
                                } else {
                                        /** assegna le carte se ci sono ancora nel mazzo */
                                        if(mazzo.carteNelMazzo.size() > 0) {
                                                mArrayPescate.add(mazzo.assegnaCarte(computer, 1).getName());
                                                mArrayPescate.add(mazzo.assegnaCarte(player, 1).getName());
                                        }
                                        /** tocca alla cpu il prossimo tiro */
                                        tira = 1;
                                        computer.assegnaPunti(cartaP, cartaC);
                                }
                               
                                /** aggiorno l'UI e setto lo stato a false */
                                mArrayTavolo.add(cartaP.getName());
                                if(mArrayTavolo.size() == 1) mArrayTavolo.add(cartaC.getName());
                                mArrayTavoloAdapter.notifyDataSetChanged();
                                mArrayCard.remove(cartaP.getName());
                                mArrayCardAdapter.notifyDataSetChanged();
                                mArrayPescateAdapter.notifyDataSetChanged();
                                stato = false;
                        }
                }
        }
}

Il logcat:

Codice: [Seleziona]
04-27 02:44:55.105: E/AndroidRuntime(339): Uncaught handler: thread main exiting due to uncaught exception
04-27 02:44:55.135: E/AndroidRuntime(339): java.lang.RuntimeException: Unable to start activity ComponentInfo{n4tty.tre.sette/n4tty.tre.sette.Tre7StartPlay}: android.view.InflateException: Binary XML file line #22: Error inflating class <unknown>
04-27 02:44:55.135: E/AndroidRuntime(339):         at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2496)
04-27 02:44:55.135: E/AndroidRuntime(339):         at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2512)
04-27 02:44:55.135: E/AndroidRuntime(339):         at android.app.ActivityThread.access$2200(ActivityThread.java:119)
04-27 02:44:55.135: E/AndroidRuntime(339):         at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1863)
04-27 02:44:55.135: E/AndroidRuntime(339):         at android.os.Handler.dispatchMessage(Handler.java:99)
04-27 02:44:55.135: E/AndroidRuntime(339):         at android.os.Looper.loop(Looper.java:123)
04-27 02:44:55.135: E/AndroidRuntime(339):         at android.app.ActivityThread.main(ActivityThread.java:4363)
04-27 02:44:55.135: E/AndroidRuntime(339):         at java.lang.reflect.Method.invokeNative(Native Method)
04-27 02:44:55.135: E/AndroidRuntime(339):         at java.lang.reflect.Method.invoke(Method.java:521)
04-27 02:44:55.135: E/AndroidRuntime(339):         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
04-27 02:44:55.135: E/AndroidRuntime(339):         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
04-27 02:44:55.135: E/AndroidRuntime(339):         at dalvik.system.NativeStart.main(Native Method)
04-27 02:44:55.135: E/AndroidRuntime(339): Caused by: android.view.InflateException: Binary XML file line #22: Error inflating class <unknown>
04-27 02:44:55.135: E/AndroidRuntime(339):         at android.view.LayoutInflater.createView(LayoutInflater.java:513)
04-27 02:44:55.135: E/AndroidRuntime(339):         at com.android.internal.policy.impl.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:56)
04-27 02:44:55.135: E/AndroidRuntime(339):         at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:563)
04-27 02:44:55.135: E/AndroidRuntime(339):         at android.view.LayoutInflater.rInflate(LayoutInflater.java:618)
04-27 02:44:55.135: E/AndroidRuntime(339):         at android.view.LayoutInflater.rInflate(LayoutInflater.java:621)
04-27 02:44:55.135: E/AndroidRuntime(339):         at android.view.LayoutInflater.inflate(LayoutInflater.java:407)
04-27 02:44:55.135: E/AndroidRuntime(339):         at android.view.LayoutInflater.inflate(LayoutInflater.java:320)
04-27 02:44:55.135: E/AndroidRuntime(339):         at android.view.LayoutInflater.inflate(LayoutInflater.java:276)
04-27 02:44:55.135: E/AndroidRuntime(339):         at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:198)
04-27 02:44:55.135: E/AndroidRuntime(339):         at android.app.Activity.setContentView(Activity.java:1622)
04-27 02:44:55.135: E/AndroidRuntime(339):         at n4tty.tre.sette.Tre7StartPlay.onCreate(Tre7StartPlay.java:35)
04-27 02:44:55.135: E/AndroidRuntime(339):         at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
04-27 02:44:55.135: E/AndroidRuntime(339):         at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2459)
04-27 02:44:55.135: E/AndroidRuntime(339):         ... 11 more
04-27 02:44:55.135: E/AndroidRuntime(339): Caused by: java.lang.reflect.InvocationTargetException
04-27 02:44:55.135: E/AndroidRuntime(339):         at android.widget.GridView.<init>(GridView.java:65)
04-27 02:44:55.135: E/AndroidRuntime(339):         at java.lang.reflect.Constructor.constructNative(Native Method)
04-27 02:44:55.135: E/AndroidRuntime(339):         at java.lang.reflect.Constructor.newInstance(Constructor.java:446)
04-27 02:44:55.135: E/AndroidRuntime(339):         at android.view.LayoutInflater.createView(LayoutInflater.java:500)
04-27 02:44:55.135: E/AndroidRuntime(339):         ... 23 more
04-27 02:44:55.135: E/AndroidRuntime(339): Caused by: java.lang.RuntimeException: Don't call setOnClickListener for an AdapterView. You probably want setOnItemClickListener instead
04-27 02:44:55.135: E/AndroidRuntime(339):         at android.widget.AdapterView.setOnClickListener(AdapterView.java:750)
04-27 02:44:55.135: E/AndroidRuntime(339):         at android.view.View.<init>(View.java:2011)
04-27 02:44:55.135: E/AndroidRuntime(339):         at android.view.ViewGroup.<init>(ViewGroup.java:290)
04-27 02:44:55.135: E/AndroidRuntime(339):         at android.widget.AdapterView.<init>(AdapterView.java:228)
04-27 02:44:55.135: E/AndroidRuntime(339):         at android.widget.AbsListView.<init>(AbsListView.java:508)
04-27 02:44:55.135: E/AndroidRuntime(339):         at android.widget.GridView.<init>(GridView.java:69)
04-27 02:44:55.135: E/AndroidRuntime(339):         ... 27 more

l'errore sembra essere nell'onCreate della seconda activity, durante il setContentView del layout match:

Codice (XML): [Seleziona]
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
   android:orientation="vertical"
   android:layout_width="fill_parent"
   android:layout_height="fill_parent" >
   
    <LinearLayout android:id="@+id/tavolo"
       android:layout_width="fill_parent"
       android:layout_height="fill_parent"
       android:orientation="horizontal"
       android:layout_weight="1" >
   
        <GridView android:id="@+id/tavoloMazzo"
                android:layout_width="fill_parent"
                android:layout_height="fill_parent"
                android:layout_weight="1"
                android:orientation="horizontal"
                android:gravity="center"
                android:numColumns="2" >
       
        </GridView>
       
        <GridView android:id="@+id/tavoloCarte"
                android:layout_width="fill_parent"
                android:layout_height="fill_parent"
                android:layout_weight="1"
                android:orientation="horizontal"
                android:gravity="center"
                android:numColumns="2"
                android:onClick="togliCarte" >
       
        </GridView>
   
    </LinearLayout>
       
    <GridView android:id="@+id/cartePlayer"
       android:layout_width="fill_parent"
       android:layout_height="fill_parent"
       android:layout_weight="1"
       android:orientation="horizontal"
       android:gravity="center"
       android:numColumns="3"  >
       
    </GridView>
   
</LinearLayout>

illuminatemi please :)
« Ultima modifica: 27 Aprile 2012, 11:48:50 CEST da N4tty »
WE ARE NOT HERE TO JUDGE WHAT'S GOOD FROM BAD, BUT TO DO THE THING THAT ARE RIGHT

Offline N4tty

  • Nuovo arrivato
  • *
  • Post: 13
  • Respect: 0
    • Mostra profilo
    • While(1) QI++;
  • Sistema operativo:
    ArchLinux
Re:inflate e runtime exception al cambio di activity
« Risposta #1 il: 27 Aprile 2012, 14:49:45 CEST »
0
Nessuno riesce a capirci qualcosa?? la cosa strana è anche l'eccezione a runtime che mi dice di non settare onclicklistener per un adapterView che non capisco a cosa si riferisce, visto che setto onItemClickListener nelle gridView, mentre l'unico onClickListener è per i bottoni della prima activity, settati su dei bottoni che sono semplici view...
WE ARE NOT HERE TO JUDGE WHAT'S GOOD FROM BAD, BUT TO DO THE THING THAT ARE RIGHT

Offline iceweasel

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 878
  • Respect: +147
    • Mostra profilo
  • Dispositivo Android:
    LGE P990 - Google Nexus 5
  • Sistema operativo:
    Linux Debian Sid
Re:inflate e runtime exception al cambio di activity
« Risposta #2 il: 27 Aprile 2012, 17:16:30 CEST »
+1
Nel file XML controlla: «android:onClick="togliCarte"». Non vedo nessun metodo "togliCarte".
adb logcat | tee /tmp/logcat | grep TAG

Offline N4tty

  • Nuovo arrivato
  • *
  • Post: 13
  • Respect: 0
    • Mostra profilo
    • While(1) QI++;
  • Sistema operativo:
    ArchLinux
Re:inflate e runtime exception al cambio di activity
« Risposta #3 il: 28 Aprile 2012, 11:05:39 CEST »
0
hai ragione era una cosa che avevo inserito e poi tolto, ma mi ero scordato di toglierlo dal layout e i miei poveri occhi stanchi non lo notavano  :-)

grazie mille!
WE ARE NOT HERE TO JUDGE WHAT'S GOOD FROM BAD, BUT TO DO THE THING THAT ARE RIGHT