Autore Topic: i dati contenuti nel bundle non vengono visualizzati  (Letto 401 volte)

Offline ale.p

  • Nuovo arrivato
  • *
  • Post: 4
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    none
  • Sistema operativo:
    windows 7-32bit
i dati contenuti nel bundle non vengono visualizzati
« il: 29 Agosto 2013, 19:15:20 CEST »
0
Buonasera a tutto il forum, vi seguo come "fantasma" ormai da settimane ma fino ad ora ho trovato tutto il necessario facendo la ricerca. Ora però mi si pone un problema che non riesco proprio a risolvere. Premetto che ho letto i vostri tutorials, ho ricercato nel forum, mi sembra di fare tutte le azioni corrette ma non riesco proprio a far funzionare questa dannata cosa e che ormai sono due giorni che impazzisco su questo problema: ho un'Activity che prende degli input dall'utente tramite EditText, li mette in un bundle e li passa ad un'Activity secondaria che li visualizza tramite delle TextView. Gli input sono presi da sei EditText, delle quali però ne viene visualizzata una per volta (con setVisibility) e si passa da una all'altra premendo un bottone (che teoricamente prima del "cambio" dovrebbe mettere la stringa inserita nel bundle). Uso il condizionale perchè non capisco se effettivamente avvenga. Comunque, dopo l'inserimento dell'ultima stringa, il bottone lancia la seconda Activity che dovrebbe recuperare il bundle passato e mettere il tutto nelle sei TextView di cui dispone; il problema è qui, vengono visualizzate delle righe bianche. Ho provato a non inserire gli oggetti del bundle nelle TextView ma delle stringhe già definite e vengono visualizzate correttamente. Altresì ho provato a verificare se il bundle recuperato dalla seconda Activity è null, e non lo è ergo sto diventando matto! vi metto il codice java delle due Activity che sicuramente rende il tutto più comprensibile. Ho rimosso le righe del package e dell'import perchè qui non ci sono errori, fatemi sapere se è necessario siano presenti anche gli xml!
questa è la prima activity

Codice (Java): [Seleziona]
public class GameActivity extends Activity implements OnClickListener {
        Button gbutton;
        EditText who,when,whatdoes,where,withwho,why;
        Bundle finalresult;
        private int n=0;

        @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_game);
        finalresult=new Bundle();
        gbutton=(Button) findViewById(R.id.gamebutton);
        who=(EditText) findViewById(R.id.who);
        when=(EditText) findViewById(R.id.when);
        whatdoes=(EditText) findViewById(R.id.whatdoes);
        where=(EditText) findViewById(R.id.where);
        withwho=(EditText) findViewById(R.id.withwho);
        why=(EditText) findViewById(R.id.why);
        gbutton.setOnClickListener(this);
        who.setEnabled(false);
        when.setEnabled(false);
        whatdoes.setEnabled(false);
        where.setEnabled(false);
        withwho.setEnabled(false);
        why.setEnabled(false);
        }
       
        @Override
    public void onClick(View view) {
                who.setEnabled(true);
        when.setEnabled(true);
        whatdoes.setEnabled(true);
        where.setEnabled(true);
        withwho.setEnabled(true);
        why.setEnabled(true);
        switch (n) {
        case 0://player1 inserisce chi, mette il dato nel bundle e passa a player2
                gbutton.setText("Passa al giocatore 2");
                who.setVisibility(View.VISIBLE);
                who.requestFocus();
                finalresult.putString("who",who.getText().toString());
                when.setVisibility(View.GONE);
                whatdoes.setVisibility(View.GONE);
                where.setVisibility(View.GONE);
                withwho.setVisibility(View.GONE);
                why.setVisibility(View.GONE);
                n++;
                break;
       
        case 1://player2 inserisce quando, mette il dato nel bundle e passa a player3
                gbutton.setText("Passa al giocatore 3");
                when.setVisibility(View.VISIBLE);
                when.requestFocus();
                finalresult.putString("when",when.getText().toString());
                who.setVisibility(View.GONE);
                whatdoes.setVisibility(View.GONE);
                where.setVisibility(View.GONE);
                withwho.setVisibility(View.GONE);
                why.setVisibility(View.GONE);
                n++;
                break;
       
        case 2://player3 inserisce cosa fa, mette il dato nel bundle e passa a player4
                gbutton.setText("Passa al giocatore 4");
                whatdoes.setVisibility(View.VISIBLE);
                whatdoes.requestFocus();
                finalresult.putString("whatdoes",whatdoes.getText().toString());
                who.setVisibility(View.GONE);
                when.setVisibility(View.GONE);
                where.setVisibility(View.GONE);
                withwho.setVisibility(View.GONE);
                why.setVisibility(View.GONE);
                n++;
                break;
               
        case 3://player4 inserisce dove, mette il dato nel bundle e passa a player5
                gbutton.setText("Passa al giocatore 5");
                where.setVisibility(View.VISIBLE);
                where.requestFocus();
                finalresult.putString("where",where.getText().toString());
                who.setVisibility(View.GONE);
                whatdoes.setVisibility(View.GONE);
                when.setVisibility(View.GONE);
                withwho.setVisibility(View.GONE);
                why.setVisibility(View.GONE);
                n++;
                System.out.println(where);
                break;
               
        case 4://player5 inserisce con chi, mette il dato nel bundle e passa a player6
                gbutton.setText("Passa al giocatore 6");
                withwho.setVisibility(View.VISIBLE);
                withwho.requestFocus();
                finalresult.putString("withwho",withwho.getText().toString());
                who.setVisibility(View.GONE);
                whatdoes.setVisibility(View.GONE);
                where.setVisibility(View.GONE);
                when.setVisibility(View.GONE);
                why.setVisibility(View.GONE);
                n++;
                break;
               
        case 5: //player6 inserisce perchè, mette il dato nel bundle e passa all'avvio della schermata finale
                gbutton.setText("Guarda il risultato!");
                why.setVisibility(View.VISIBLE);
                why.requestFocus();
                finalresult.putString("why",why.getText().toString());
                who.setVisibility(View.GONE);
                whatdoes.setVisibility(View.GONE);
                where.setVisibility(View.GONE);
                withwho.setVisibility(View.GONE);
                when.setVisibility(View.GONE);
                n++;
                break;
               
        case 6:
                Intent finalres_intent=new Intent(getApplicationContext(),PhraseActivity.class);
                finalres_intent.putExtras(finalresult);
                startActivity(finalres_intent);
                break;
                       
        }
       
       
        }

}

mentre questa è la seconda
Codice (Java): [Seleziona]
public class PhraseActivity extends Activity implements OnClickListener {
        Button rbutton;
        TextView whotext,whentext,whatdoestext,wheretext,withwhotext,whytext;
        Bundle finalresult;

        @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_phrase);
        finalresult=this.getIntent().getExtras();
        rbutton=(Button) findViewById(R.id.menu_button);
        whotext=(TextView) findViewById(R.id.who_txt);
        whentext=(TextView) findViewById(R.id.when_txt);
        whatdoestext=(TextView) findViewById(R.id.whatdoes_txt);
        wheretext=(TextView) findViewById(R.id.where_txt);
        withwhotext=(TextView) findViewById(R.id.withwho_txt);
        whytext=(TextView) findViewById(R.id.why_txt);
        whotext.setText(finalresult.getString("who"));
        whentext.setText(finalresult.getString("when"));
        whatdoestext.setText(finalresult.getString("whatdoes"));
        wheretext.setText(finalresult.getString("where"));
        withwhotext.setText(finalresult.getString("withwho"));
        whytext.setText(finalresult.getString("why"));
        rbutton.setOnClickListener(this);
        }

        @Override
        public void onClick(View view) {
                switch (view.getId()) {
                case R.id.menu_button:
                        Intent menu_intent=new Intent(getApplicationContext(),MenuActivity.class);
                startActivity(menu_intent);
                break;
                }
       
        }
               
}
       
vi metto già in guardia, molto probabilmente sbaglio una cosa stupidissima, ho già usato java come linguaggio e facevo sempre errori sciocchi  :-P

Riassumendo, il problema in difinitiva è che, una volta lanciata la seconda activity, viene visualizzato il titolo, lo spazio per le TextView (che però sono vuote o almeno non visualizzano nulla) ed il bottone al suo posto e funzionante.
Già che ci siamo, come si fa per visualizzare cosa contiene una certa variabile ad un dato punto del codice, sulla console, per esempio se volessi stampare a console il contenuto del bundle della prima activity prima che venga passato alla seconda come dovrei fare?
Vi saluto e Vi ringrazio in anticipo! Alessandro

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:i dati contenuti nel bundle non vengono visualizzati
« Risposta #1 il: 29 Agosto 2013, 19:50:30 CEST »
0
A occhio sembrerebbe giusto, però il problema potrebbe essere nelle KEYS che dovrebbero avere il package come prefisso (c'è scritto nella documentazione di putExtras).

Potresti provare a cambiare il codice mettendo le KEYS direttamente attraverso l'Intent.

Codice (Java): [Seleziona]
Intent i = new Intent(this,PhraseActivity.class);
...
i.putExtra("why",why.getText().toString());

Comunque se metti un breakpoint all'arrivo nella OnCreate e in modo Debug visualizzi il Bundle, dovresti capire cosa non va.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline ale.p

  • Nuovo arrivato
  • *
  • Post: 4
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    none
  • Sistema operativo:
    windows 7-32bit
Re:i dati contenuti nel bundle non vengono visualizzati
« Risposta #2 il: 30 Agosto 2013, 10:02:50 CEST »
0
uhmm ok, quindi intendi dire di passare direttamente le varie stringhe con la putExtras e non il bundle? Cosa intendi per "ci andrebbe il package nelle keys"? Non da problemi col fatto che c'è una case o che le EditText vengano messe invisibili (anzi "gone") appena sono state usate? Non ho capito il resto del discorso invece, come vedo dal Debug le variabili? non le ho proprio trovate. Un'altra cosa che non ho trovato e mi piacerebbe trovare è la documentazione delle API, ho solo trovato una comparazione con le differenze tra le varie versioni delle API (es. le differenze tra la 16 e la 17) ma nulla di completo! Mi sarebbe molto utile conoscere tutte le funzioni, che tipi di dati elaborano, cosa restituiscono, ecc.
Grazie mille del tuo tempo, adesso provo a fare come dici!

edit: facendo le putExtra con le varie stringhe invece che la putExtras con il bundle funziona! come mai però non dovrebbe funzionare con il bundle?
« Ultima modifica: 30 Agosto 2013, 10:43:05 CEST da ale.p, Reason: risolto! »

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:i dati contenuti nel bundle non vengono visualizzati
« Risposta #3 il: 30 Agosto 2013, 10:36:19 CEST »
0
Per la putExtra io dicevo di farla direttamente dall'Intent, giusto per cambiare qualcosa (io l'ho sempre fatta così), non di unificarla alla fine.

Per il Debug, mi riferisco al debug standard in eclipse. Troppo lungo da spiegare in un forum, ma trovi sicuramente spiegazioni nel manuale online di Eclipse.

Per le API sinceramente su Package Index | Android Developers ci sono tutte.  :-)  Per ogni classe e funzione, in alto a destra trovi in quale API version è stata aggiunta. Però eviterei di approcciare lo studio sistematico di tutte le funzioni nelle API android (sono oggettivamente troppe), meglio se vai per argomenti e cerchi tutorial in cui sono trattati.

Una cosa che può essere di aiuto per orientarsi nelle versioni delle API, è tenere presente se ad esempio usi una funzione introdotta dalle API 18, girerà solo sui device con l'ultimissimo JellyBean, mentre se usi una funzione introdotta dalle API 1 girerà su tutti.

Pare complesso pensare a quante versioni di API (18) ci sono, ma in pratica si possono raggruppare in 3 categorie: (1) fino ad API 9 inclusa sono praticamente obsolete, (2) la 10 è da considerare se si vuole supportare Gingerbread 2.3.3 che bene o male è presente ancora su un terzo dei device mondiali, (3) dalla 14 in poi si parla di android 4.x che copre gli altri due terzi del parco device. Le 11,12,13 di HoneyComb sono da ignorare. Hai quindi solo due scelte fondamentali: scrivere applicazioni per android per API 10 (con MINSDK=10 prendi il 98% dei device) o per API 14 (con MINSDK=14 prendi il 66% dei device).
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline ale.p

  • Nuovo arrivato
  • *
  • Post: 4
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    none
  • Sistema operativo:
    windows 7-32bit
Re:i dati contenuti nel bundle non vengono visualizzati
« Risposta #4 il: 30 Agosto 2013, 11:13:52 CEST »
0
non ci credo ho girato android developers in lungo e in largo ma non le avevo viste! grazie! ottimo anche il chiarimento sulle varie versioni di API, vedendone così tante mi stavo già preoccupando! la putExtras la facevo già dall'intent ma con il bundle, se ho capito bene cosa intendi.. comunque l'ho cambiato senza usare il bundle, tutto alla fine nel case 6 con le putExtra e mettendo this nella intent al posto di getApplicationContext()

ora i codici risultano così
prima activity
Codice (Java): [Seleziona]
case 6:
                Intent finalres_intent=new Intent(this,PhraseActivity.class);
                //finalres_intent.putExtras(finalresult);
                finalres_intent.putExtra("who", who.getText().toString());
                finalres_intent.putExtra("when", when.getText().toString());
                finalres_intent.putExtra("whatdoes", whatdoes.getText().toString());
                finalres_intent.putExtra("where", where.getText().toString());
                finalres_intent.putExtra("withwho", withwho.getText().toString());
                finalres_intent.putExtra("why", why.getText().toString());
                startActivity(finalres_intent);
                break;

seconda activity
Codice (Java): [Seleziona]
protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_phrase);
        //finalresult=this.getIntent().getExtras();
        rbutton=(Button) findViewById(R.id.menu_button);
        whotext=(TextView) findViewById(R.id.who_txt);
        whentext=(TextView) findViewById(R.id.when_txt);
        whatdoestext=(TextView) findViewById(R.id.whatdoes_txt);
        wheretext=(TextView) findViewById(R.id.where_txt);
        withwhotext=(TextView) findViewById(R.id.withwho_txt);
        whytext=(TextView) findViewById(R.id.why_txt);
        whotext.setText(this.getIntent().getStringExtra("who"));
        whentext.setText(this.getIntent().getStringExtra("when"));
        whatdoestext.setText(this.getIntent().getStringExtra("whatdoes"));
        wheretext.setText(this.getIntent().getStringExtra("where"));
        withwhotext.setText(this.getIntent().getStringExtra("withwho"));
        whytext.setText(this.getIntent().getStringExtra("why"));
        rbutton.setOnClickListener(this);
        }

e il tutto funziona! rimane che non ho capito cosa era sbagliato  ???
L'importante è che vada, ti ringrazio!!

Offline eagledeveloper

  • Translate Team
  • Utente senior
  • ****
  • Post: 516
  • Respect: +37
    • Google+
    • 347516210
    • dark_pinz
    • @WandDStudios
    • Mostra profilo
    • W&D Studios
  • Dispositivo Android:
    HTC One X e HTC One
  • Play Store ID:
    W%26D+Studios
  • Sistema operativo:
    Ubuntu / Windows 7
Re:i dati contenuti nel bundle non vengono visualizzati
« Risposta #5 il: 30 Agosto 2013, 11:22:25 CEST »
0
Il problema era qui:

Codice (Java): [Seleziona]
who.setVisibility(View.VISIBLE);
who.requestFocus();
finalresult.putString("who",who.getText().toString());

Andavi a prendere il testo ma di testo dentro non ce n'era... (se ho capito giusto)
I numeri contano molto di più del seme.

Offline ale.p

  • Nuovo arrivato
  • *
  • Post: 4
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    none
  • Sistema operativo:
    windows 7-32bit
Re:i dati contenuti nel bundle non vengono visualizzati
« Risposta #6 il: 30 Agosto 2013, 12:41:09 CEST »
0
perchè il testo veniva messo nella variabile dopo il click, giusto? comunque per rispondere al messaggio di prima di bradipao mi sono espresso male, non è mia intenzione impararle tutte  :-) solo che averle sotto mano è cosa buona e giusta  :D
se posso esporvi un altro piccolo problemino, stesso codice di prima, nella GameActivity (prima activity) mi piacerebbe inserire un controllo che passa alla casella successiva solo nel caso in cui sia stato immesso del testo in quella corrente.
ho provato una cosa del genere, qui riporto il codice che ho aggiunto nella "case 5":
Codice (Java): [Seleziona]
if(why.getText().toString().isEmpty()) {
                        n=5;
                        }
                        else {
                                n++;
                        }
che funziona, il problema è che quando il testo viene inserito servono due click del pulsante perchè si passi alla casella successiva. Altra banalità, ne sono sicuro, sono 3 anni che non programmo più e mi perdo sempre nel codice!
grazie a tutti!