Autore Topic: Problema con Spinner  (Letto 913 volte)

Offline MasterChief

  • Utente junior
  • **
  • Post: 83
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    OnePlus X
  • Sistema operativo:
    windows 10
Problema con Spinner
« il: 07 Maggio 2012, 11:22:16 CEST »
0
Ciao a tutti, innanzitutto vi faccio i complimenti per il forum perché lo trovo utile e ricco di informazioni interessanti dato che sto sviluppando da poco app per android.

Sto realizzando una semplice calcolatrice per i numeri razionali, per selezionare l'operatore uso uno Spinner che contiene un array contenente i vari operatori. Ritengo che il problema sia lo spinner perché ho poca familiarità con questo oggetto e non conosco molto bene i suoi metodi, ma potrei sbagliarmi quasi sicuramente.
Nel codice non mi vengono mostrati errori ma sull'emulatore l'app va in crash all'apertura.
Sapreste darmi una mano a risolvere questo problema?  :-)
Allego il codice java del Main e codice xml dello spinner

Grazie mille in anticipo!!  :-)

Codice (Java): [Seleziona]
package raz.pack;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Spinner;
import android.widget.TextView;

public class Main extends Activity implements OnItemSelectedListener{
   
        EditText num1, num2, den1, den2, ris_num, ris_den;
        TextView nome, ver, num, den, ris, raz1, raz2, avviso;
        Button calcola;
        Spinner listaOp;
        //   posizione:     0               1                 2              3
        String[] List = { "addizione", "sottrazione", "moltiplicazione", "divisione" };
       
        int pos;
         
        Razionale risultato;
        Razionale r1;
        Razionale r2;  
       
       
        /**
         * metodo che inizializza i vari componenti della calcolatrice razionale
         */

        @Override
        public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        num1 = (EditText) findViewById (R.id.Num1); // numeratore 1
        num2 = (EditText) findViewById (R.id.Num2);  // numeratore 2
        den1 = (EditText) findViewById (R.id.Den1); // denominatore 1
        den2 = (EditText) findViewById (R.id.Den2); // denominatore2
        ris_num = (EditText) findViewById (R.id.Ris_Num); // resultato_numeratore
        ris_den = (EditText) findViewById (R.id.Ris_Den); // resultato_denominatore
        nome = (TextView) findViewById (R.id.txtRazionale); // app_name
        ver = (TextView) findViewById (R.id.txtVersion); // versione
        num = (TextView) findViewById (R.id.txtNumeratore); // txt numeratore
        den = (TextView) findViewById (R.id.txtDenominatore); // txt denominatore
        ris = (TextView) findViewById (R.id.txtRisultato); // txt resultato
        raz1 = (TextView) findViewById (R.id.txtRaz1); // rationale1
        raz2 = (TextView) findViewById (R.id.txtRaz2); // rationale2
        avviso = (TextView) findViewById (R.id.txtAvviso); // txt avviso
        calcola = (Button) findViewById (R.id.btnCalcola); // bottone calcola    
        listaOp = (Spinner) findViewById (R.id.lista_Op); // spinner con scelta operatori
       
        ArrayAdapter <String> adapter = new ArrayAdapter<String>(Main.this, android.R.layout.simple_spinner_item, List);
        listaOp.setAdapter(adapter);        
        listaOp.setOnItemSelectedListener(this);

        calcola.setOnClickListener(new View.OnClickListener() {
                        public void onClick(View v) {
                                check();
                                creation();
                               
                                onItemSelected(listaOp, listaOp.getSelectedView(), pos, listaOp.getItemIdAtPosition(pos));
                               
                                setRis();
                        }//end onClick
                });// fine bottone calcola
       
        }// fine onCreate

       
        /**
         * metodo per lavorare con gli elementi dello spinner
         */

        public void onItemSelected(AdapterView<?> arg0, View v, int arg2, long arg3) {
                pos = listaOp.getSelectedItemPosition();
                switch(pos){
                case 0:
                        risultato = r1.somma(r2);
                        break;
                case 1:
                        risultato = r1.diff(r2);
                        break;
                case 2:
                        risultato = r1.prodotto(r2);
                        break;
                case 3:
                        risultato = r1.divisione(r2);
                        break;
                }
        }// fine onItemSelected

       
        /**
         * metodo se nulla è selezionato dello spinner
         */

        public void onNothingSelected(AdapterView<?> arg0) {
        }// end onNothingSelected
       
       
        /**
         * check: controlla la scrittura dei due razionali
         */

        public void check(){
                //check if a part of rational 1 is different from ""
                if (num1.getText().equals("") || den1.getText().equals("") || den1.getText().equals(0)){
                        //set the rational 1 to 0/1
                        num1.setText( new Razionale().getNum() );
                        den1.setText( new Razionale().getDen() );
                }
                //check if a part of rational 2 is different from ""
                if (num2.getText().equals("") || den2.getText().equals("") || den2.getText().equals(0)){
                        //set the rational 2 to 0/1
                        num2.setText( new Razionale().getNum() );
                        den2.setText( new Razionale().getDen() );
                }
        }// fine check
       
       
        /**
         * crea i due razionali e il razionale risultato
         */

        public void creation(){
                 risultato = new Razionale();
                 r1 = new Razionale( Integer.parseInt(num1.getText().toString()) , Integer.parseInt(den1.getText().toString()) );
                 r2 = new Razionale( Integer.parseInt(num2.getText().toString()) , Integer.parseInt(den2.getText().toString()) );
        }// fine creation
       
       
        /**
         * setta il risultato e lo stampa negli apposti spazi
         */

        public void setRis(){
                ris_num.setText(risultato.getNum());
                ris_den.setText(risultato.getDen());   
        }
       
}// fine Main


Codice (XML): [Seleziona]
 <Spinner
       android:id="@+id/lista_Op"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:layout_alignLeft="@+id/txtDenominatore"
       android:layout_alignTop="@+id/btnCalcola"
       android:layout_toLeftOf="@+id/textView1"
       android:entries="@array/list"
       android:entryValues="@array/values"
       />

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:Problema con Spinner
« Risposta #1 il: 07 Maggio 2012, 11:42:18 CEST »
0
Per fare il debug degli errori, esegui l'applicazione e riproduci il crash, poi in Eclipse apri il pannellino LOGCAT (maggiori info cliccando i link nella firma di tutti i moderatori) e cerca partendo dall'ultima la riga che contiene ERROR e il riferimento ad un tuo file di codice (ci trovi anche il numero di riga che ha causato l'errore).
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline MasterChief

  • Utente junior
  • **
  • Post: 83
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    OnePlus X
  • Sistema operativo:
    windows 10
Re:Problema con Spinner
« Risposta #2 il: 07 Maggio 2012, 11:50:49 CEST »
0
Ok, perfetto :-) ora provo.
Ti ringrazio per la disponibilità  :-)

Offline MasterChief

  • Utente junior
  • **
  • Post: 83
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    OnePlus X
  • Sistema operativo:
    windows 10
Re:Problema con Spinner
« Risposta #3 il: 07 Maggio 2012, 12:27:59 CEST »
0
scusami ma è la prima volta che uso il LOGCAT e vorrei capire come si "interpreta", carico una foto di quello che mi viene mostrato.
Guardando il LOGCAT ho visto che l'unico errore che fa riferimento al mio codice è nel Main (che ho postato prima) alla riga 79 e sarebbe la riga dove calcolo il "risultato" con la somma del metodo onItemSelected. Non riesco proprio a capire cosa sto sbagliato.

Grazie per la pazienza  :-)

Offline pivoide

  • Utente junior
  • **
  • Post: 133
  • Respect: +19
    • Mostra profilo
  • Dispositivo Android:
    Samsung galaxy tab 10.1
  • Play Store ID:
    codicerosso
  • Sistema operativo:
    Ubuntu 11.04
Re:Problema con Spinner
« Risposta #4 il: 07 Maggio 2012, 12:44:41 CEST »
+1
Non allochi i due razionali r1 ed r2. Da qualche parte nel codice devi fare le new passandogli nel costruttore i valori presi dai testi inseriti.
Odio l'inglese e per un informatico non è il massimo

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:Problema con Spinner
« Risposta #5 il: 07 Maggio 2012, 12:51:28 CEST »
+1
La tipologia dell'errore è NULLPOINTEREXCEPTION (prime righe rosse), vuol dire che alla riga 79 una delle variabili che passi è NULL e non dovrebbe esserlo.

Per scoprire quale sia, commenta la riga in questione e fai uscire nel LogCat i valori delle variabili.
Puoi farlo con l'apposita funzione:
Codice (Java): [Seleziona]
if (listaop==null) Log.d("MIA_APP","La variabile LISTAOP è NULL");
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline MasterChief

  • Utente junior
  • **
  • Post: 83
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    OnePlus X
  • Sistema operativo:
    windows 10
Re:Problema con Spinner
« Risposta #6 il: 07 Maggio 2012, 14:30:52 CEST »
0
 ho modificato il metodo dello spinner in questo modo
Codice (Java): [Seleziona]
public void onItemSelected(AdapterView<?> arg0, View v, int arg2, long arg3) {
                pos = listaOp.getSelectedItemPosition();
                switch(pos){
                case 0:
                        if (listaOp==null) Log.d("MIA_APP","La variabile LISTAOP è NULL");
                        risultato = r1.somma(r2);
                        break;
                case 1:
                        if (listaOp==null)      Log.d("MIA_APP","La variabile LISTAOP è NULL");
                        risultato = r1.diff(r2);
                        break;
                case 2:
                        if (listaOp==null) Log.d("MIA_APP","La variabile LISTAOP è NULL");    
                        risultato = r1.prodotto(r2);
                        break;
                case 3:
                        if (listaOp==null) Log.d("MIA_APP","La variabile LISTAOP è NULL");
                        risultato = r1.divisione(r2);
                        break;
                }
        }// fine onItemSelected
nel LOGCAT però non mi vengono visualizzate le variabili, da il solito errore java.lang.NULLPOINTEREXCEPTION alla riga 81
ovvero dove c'è "risultato" della somma (case 0)... ho sbagliato a riportare la tua istruzione o sono io che non capisco cosa sto facendo?   :-)
« Ultima modifica: 07 Maggio 2012, 14:33:33 CEST da Nic »

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:Problema con Spinner
« Risposta #7 il: 07 Maggio 2012, 14:49:40 CEST »
0
Io ho una mezza idea di quale sia il problema ed anche pivoide lo ha accennato, ma mi sembra più utile vederlo in debug, così prendi dimestichezza con lo strumento.

Dunque, se ti dice che la riga incriminata è quella con risultato = r1.somma(r2); allora o r1 o r2 sono null.

Per vederlo nel LogCat puoi aggiungere prima dell'errore:
Codice (Java): [Seleziona]
if (r1==null) Log.d("MIA_APP","La variabile R1 è NULL");
if (r2==null) Log.d("MIA_APP","La variabile R2 è NULL");
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline MasterChief

  • Utente junior
  • **
  • Post: 83
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    OnePlus X
  • Sistema operativo:
    windows 10
Re:Problema con Spinner
« Risposta #8 il: 07 Maggio 2012, 14:58:20 CEST »
0
ok, ho fatto un metodo apposta che si chiama creation() per fare le new dei due razionali, ma se dovessero essere null vuol dire che un razionale non riesce ad ottenere il numero che gli viene inserito nella casella apposta. Intanto provo inserendo queste due righe  :-)

Offline MasterChief

  • Utente junior
  • **
  • Post: 83
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    OnePlus X
  • Sistema operativo:
    windows 10
Re:Problema con Spinner
« Risposta #9 il: 07 Maggio 2012, 16:12:30 CEST »
0
ok, inizio a capire come funziona il LOGCAT... ho risolto il problema di r1 e r2 ora non sono = null.
Riesco a cambiare elemento dello spinner senza problemi solo che se scelgo "divisione" e gli editText hanno dei valori inseriti diversi da 0 va in crash dicendo "java.lang.ArithmeticException: divide by 0 "

ho modificato il Main e ora ho questo:
Codice (Java): [Seleziona]
package raz.pack;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Spinner;
import android.widget.TextView;

public class Main extends Activity implements OnItemSelectedListener{
   
        EditText num1, num2, den1, den2, ris_num, ris_den;
        TextView nome, ver, num, den, ris, raz1, raz2, avviso;
        Button calcola;
        Spinner listaOp;
        //   posizione:     0               1                 2              3
        String[] List = { "addizione", "sottrazione", "moltiplicazione", "divisione" };
       
        int pos;
         
        Razionale risultato = new Razionale();
        Razionale r1 = new Razionale();
        Razionale r2 = new Razionale();
       
       
        /**
         * metodo che inizializza i vari componenti della calcolatrice razionale
         */

        @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        num1 = (EditText) findViewById (R.id.Num1); // numeratore 1
        num2 = (EditText) findViewById (R.id.Num2);  // numeratore 2
        den1 = (EditText) findViewById (R.id.Den1); // denominatore 1
        den2 = (EditText) findViewById (R.id.Den2); // denominatore2
        ris_num = (EditText) findViewById (R.id.Ris_Num); // resultato_numeratore
        ris_den = (EditText) findViewById (R.id.Ris_Den); // resultato_denominatore
        nome = (TextView) findViewById (R.id.txtRazionale); // app_name
        ver = (TextView) findViewById (R.id.txtVersion); // versione
        num = (TextView) findViewById (R.id.txtNumeratore); // txt numeratore
        den = (TextView) findViewById (R.id.txtDenominatore); // txt denominatore
        ris = (TextView) findViewById (R.id.txtRisultato); // txt resultato
        raz1 = (TextView) findViewById (R.id.txtRaz1); // rationale1
        raz2 = (TextView) findViewById (R.id.txtRaz2); // rationale2
        avviso = (TextView) findViewById (R.id.txtAvviso); // txt avviso
        calcola = (Button) findViewById (R.id.btnCalcola); // bottone calcola    
        listaOp = (Spinner) findViewById (R.id.lista_Op); // spinner con scelta operatori
       
        ArrayAdapter <String> adapter = new ArrayAdapter<String>(Main.this, android.R.layout.simple_spinner_item, List);
        listaOp.setAdapter(adapter);        
        listaOp.setOnItemSelectedListener(this);

        calcola.setOnClickListener(new View.OnClickListener() {
                        public void onClick(View v) {
                               
                                if (num1.getText().equals("") || den1.getText().equals("")){
                                        num1.setText(0);
                                        den1.setText(1);
                                }
                               
                                if (num2.getText().equals("") || den2.getText().equals("")){
                                        num2.setText(0);
                                        den2.setText(1);
                                }

                                r1 = new Razionale( Integer.parseInt(num1.getText().toString()) , Integer.parseInt(den1.getText().toString()) );
                                r2 = new Razionale( Integer.parseInt(num2.getText().toString()) , Integer.parseInt(den2.getText().toString()) );
                                 
                                onItemSelected(listaOp, listaOp.getSelectedView(), pos, listaOp.getItemIdAtPosition(pos));
                               
                                ris_num.setText(risultato.getNum());
                                ris_den.setText(risultato.getDen());   
                        }//end onClick
                });// fine bottone calcola
       
        }// fine onCreate

       
        /**
         * metodo per lavorare con gli elementi dello spinner
         */

        public void onItemSelected(AdapterView<?> arg0, View v, int arg2, long arg3) {
                pos = listaOp.getSelectedItemPosition();
                switch(pos){
                case 0:
                        if (listaOp==null) Log.d("MIA_APP","La variabile LISTAOP è NULL");
                        if (r1==null) Log.d("MIA_APP","La variabile R1 è NULL");
                        if (r2==null) Log.d("MIA_APP","La variabile R2 è NULL");
                        risultato = r1.somma(r2);
                        break;
                case 1:
                        if (listaOp==null)      Log.d("MIA_APP","La variabile LISTAOP è NULL");
                        if (r1==null) Log.d("MIA_APP","La variabile R1 è NULL");
                        if (r2==null) Log.d("MIA_APP","La variabile R2 è NULL");
                        risultato = r1.diff(r2);
                        break;
                case 2:
                        if (listaOp==null) Log.d("MIA_APP","La variabile LISTAOP è NULL");
                        if (r1==null) Log.d("MIA_APP","La variabile R1 è NULL");
                        if (r2==null) Log.d("MIA_APP","La variabile R2 è NULL");
                        risultato = r1.prodotto(r2);
                        break;
                case 3:
                        if (listaOp==null) Log.d("MIA_APP","La variabile LISTAOP è NULL");
                        if (r1==null) Log.d("MIA_APP","La variabile R1 è NULL");
                        if (r2==null) Log.d("MIA_APP","La variabile R2 è NULL");
                        if (Integer.parseInt(den1.getText().toString()) == 0) Log.d("MIA_APP", "den1 = 0");
                        if (Integer.parseInt(den2.getText().toString()) == 0) Log.d("MIA_APP", "den2 = 0");
                        risultato = r1.divisione(r2);
                        break;
                }
        }// fine onItemSelected

       
        /**
         * metodo se nulla è selezionato dello spinner
         */

        public void onNothingSelected(AdapterView<?> arg0) {
        }// end onNothingSelected

}// fine Main

utilizzando le seguenti istruzioni controllo che sia effettivamente 0 ma non mi viene scritto nessun messaggio se non digito veramente 0 nell'emulatore, mi sembra piuttosto strano questo fatto.
Codice (Java): [Seleziona]
if (Integer.parseInt(den1.getText().toString()) == 0) Log.d("MIA_APP", "den1 = 0");
if (Integer.parseInt(den2.getText().toString()) == 0) Log.d("MIA_APP", "den2 = 0");
 

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:Problema con Spinner
« Risposta #10 il: 07 Maggio 2012, 18:28:20 CEST »
0
Fai uscire direttamente il valore nel LogCat, in fondo è una stringa.  ;-)

Codice (Java): [Seleziona]
Log.d("MIA_APP", "den1 = "+Integer.parseInt(den1.getText().toString());
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline MasterChief

  • Utente junior
  • **
  • Post: 83
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    OnePlus X
  • Sistema operativo:
    windows 10
Re:Problema con Spinner
« Risposta #11 il: 19 Maggio 2012, 14:31:22 CEST »
0
Ho risolto il problema :-) ora funziona tutto... in pratica sbagliavo nell'eseguire le operazioni perché le facevo fare al menù e non al bottone calcola  :D dopo ho dovuto sistemare la scrittura del risultato trasformandolo in stringa  :-) grazie a tutti per gli aiuti