Autore Topic: Problema passaggio dato ottenuto da un parsing, tra due activity  (Letto 1236 volte)

Offline dr4gone

  • Utente junior
  • **
  • Post: 66
  • Respect: +1
    • Mostra profilo
Problema passaggio dato ottenuto da un parsing, tra due activity
« il: 28 Dicembre 2011, 10:33:23 CET »
0
Ciao a tutti.. Sto cercando di creare un'activity che gestisce il login tramite un alertdialog iniziale che gestisce le sharedpreferences.. Stavo seguendo quest [facile] Passaggio di dati tra un'activity ed un'altra - Android Developers Italia per cercare di passare dati tra due activity.

Premetto che la classe che richiamo non è la classe su cui deve essere letto il dato, ma è la classe principale che usa il tabHost per gestire le scelte tra altre activity.
Quindi ricapitolando:
1) Parte la LoginActivity nella quale mi esce una stringa di BENEVENUTO che devo trasferire in un altra activity.
2)Faccio partire l'ActivityPrincipale, che gestisce tramite tabhost tutte le activity, sull'activity di BENVENUTO
3)Passo la stringa di benvenuto nella WelcomeActivity.

Riesco a fare cambiare activity, ma nella WelcomeActivity invece di restituirmi "BENVENUTO UTENTE" mi viene fuori un NULL,  mi sapreste dire dove sbaglio?
Ecco un pezzo di codice per il login.

Codice (Java): [Seleziona]
import java.net.URL;

import org.apache.http.client.HttpClient;
import org.apache.http.client.HttpResponseException;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;


import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.app.ProgressDialog;

import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;

public class LoginActivity extends Activity {
Intent intentPrincipal;

//definisco le variabili necessarie alla libreria jsopu per effettuare il parsing html
public Document doc;
Editor editor;
String textOK;

.........
     
//AsyncTask
        public class HttpGetTask extends AsyncTask<String,String,String>  {
           @Override
           public String doInBackground(String... params) {

              try {
       
                try {
                                doc = Jsoup.parse(new URL("http://www.miaurl?utente="+et_user.getText().toString()+"&pass="+et_pass.getText().toString()), 5000);
                                Element risultatoOK = (doc.getElementById("lblIntestazione"));
                                textOK = risultatoOK.text();
                               //qui ottengo che  textOK è "BENVENUTO nomeUtente"
.........
......
            }

            @Override
            protected void onPostExecute(String result) {
               // chiudo la progress dialog
               pd.dismiss();
               // gestisco i risultati generati in background e li eseguo in un altra activity
               if (textOK != null) {
                   startActivyPrincipale();
               }
               else
               {
                   Toast.makeText(LoginActivity.this,"Login errato! controlla i dati inseriti...",Toast.LENGTH_LONG).show();
                   profileDialog.show();
               }
               }
                public void startActivityPrincipale() {
                          intentPrincipal = new Intent(getApplicationContext(), ActivityPrincipale.class);
                          String pkg=getPackageName();
                          intentPrincipal.putExtra(pkg+"MyString", textOK);
                          startActivity(intentPrincipal);
                        }
               
               
         }
}

Il mio dubbio è che io textOK lo passo come String, ma dato che è un elemento generato dal parsing magari fa instanziato diversamente...

Ed ecco la WelcomeActivity:
Codice (Java): [Seleziona]
public class WelcomeActivity extends Activity {
        /** Called when the activity is first created. */
        public void onCreate(Bundle savedInstanceState) {
                    super.onCreate(savedInstanceState);
                    setContentView(R.layout.main);
                   
                    Intent intent=getIntent(); // l'intent di questa activity
                       
                String pkg=getPackageName();
               
                String s=intent.getStringExtra(pkg+".myString");  //prendo i dati dell'altra activity
                TextView debug = (TextView)findViewById(R.id.tv_debug);        
                debug.append("myString:"+s+"\n"); //visualizzo i dati

        }
}

E questo è il logcat
Codice: [Seleziona]
12-28 08:57:13.243: I/ActivityManager(59): Displayed activity com.brunolagana/.LoginActivity: 1172 ms (total 1172 ms)
12-28 08:57:17.925: I/global(1017): Default buffer size used in BufferedInputStream constructor. It would be better to be explicit if an 8k buffer is required.
12-28 08:57:17.984: D/dalvikvm(1017): GC_FOR_MALLOC freed 2498 objects / 153736 bytes in 53ms
12-28 08:57:18.124: D/dalvikvm(1017): GC_FOR_MALLOC freed 4636 objects / 500184 bytes in 43ms
12-28 08:57:18.424: D/dalvikvm(1017): GC_FOR_MALLOC freed 5691 objects / 244304 bytes in 53ms
12-28 08:57:18.754: D/dalvikvm(1017): GC_FOR_MALLOC freed 9465 objects / 414096 bytes in 62ms
12-28 08:57:18.794: I/ActivityManager(59): Starting activity: Intent { cmp=com.mypackage/.ActivityPrincipale (has extras) }
12-28 08:57:19.274: W/IInputConnectionWrapper(1017): getCursorCapsMode on inactive InputConnection
12-28 08:57:19.284: W/IInputConnectionWrapper(1017): finishComposingText on inactive InputConnection
12-28 08:57:19.435: I/ActivityManager(59): Displayed activity com.mypackage/.ActivityPrincipale: 617 ms (total 617 ms)
12-28 08:57:23.177: D/SntpClient(59): request time failed: java.net.SocketException: Address family not supported by protocol

Idee?

P.s. A scanso di equivoci dico che se richiamo textOk nella stessa activity, quindi in LoginActivity, il dato viene visualizzato correttamente.
E che corredando il tutto da log, viene eseguito correttamente, tranne la restituzione dell stringa ovviamente :)
« Ultima modifica: 28 Dicembre 2011, 11:29:54 CET da dr4gone »

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Problema passaggio dato ottenuto da un parsing, tra due activity
« Risposta #1 il: 28 Dicembre 2011, 12:14:29 CET »
0
Tra

Codice (Java): [Seleziona]
                          intentPrincipal.putExtra(pkg+"MyString", textOK);
e

Codice (Java): [Seleziona]
                String s=intent.getStringExtra(pkg+".myString");  //prendo i dati dell'altra activity
C'è un "." che balla :) LA chiave deve essere identica

Offline dr4gone

  • Utente junior
  • **
  • Post: 66
  • Respect: +1
    • Mostra profilo
Re:Problema passaggio dato ottenuto da un parsing, tra due activity
« Risposta #2 il: 28 Dicembre 2011, 13:37:12 CET »
0
Si... non l'avevo proprio notato... ho cambiato ...
Ma comunque il problema resta..
Codice (Java): [Seleziona]
public void startActivityPrincipale() {
                          intent = new Intent(getApplicationContext(), ActivityPrincipale.class);
                          String pkg=getPackageName();
                          intent.putExtra(pkg+"welcome", textOK);
                          startActivity(intent);
                        }
e nell'altra activity

Codice (Java): [Seleziona]
public class WelcomeActivity extends Activity {
        /** Called when the activity is first created. */
        public void onCreate(Bundle savedInstanceState) {
                    super.onCreate(savedInstanceState);
                    setContentView(R.layout.main);
                   
                    Intent intent=getIntent(); // l'intent di questa activity
                       
                String pkg=getPackageName();
                TextView debug = (TextView)findViewById(R.id.tv_debug);        
                debug.append("Risultato:"+intent.getStringExtra(pkg+"welcome")+"\n"); //visualizzo i dati

        }
}

 >:(
« Ultima modifica: 28 Dicembre 2011, 13:39:00 CET da dr4gone »

Offline Qlimax

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 757
  • Respect: +203
    • Google+
    • _Qlimax
    • Mostra profilo
    • www.egsolutions.ch
  • Dispositivo Android:
    Galaxy Nexus - Nexus One - Wildfire - Magic
  • Play Store ID:
    egsolutions.ch
  • Sistema operativo:
    Ubuntu 12.04, Windows 7
Re:Problema passaggio dato ottenuto da un parsing, tra due activity
« Risposta #3 il: 28 Dicembre 2011, 13:45:51 CET »
0
Codice (Java): [Seleziona]
intent = new Intent(getApplicationContext(), ActivityPrincipale.class);
sembra che non lanci WelcomeActivity...


comunque per i debug, puoi usare il la classe Log Reading and Writing Logs | Android Developers


Offline dr4gone

  • Utente junior
  • **
  • Post: 66
  • Respect: +1
    • Mostra profilo
Re:Problema passaggio dato ottenuto da un parsing, tra due activity
« Risposta #4 il: 28 Dicembre 2011, 14:00:34 CET »
0
si l'avevo scritto su che non la lancio direttamente WelcomeActivity, ma è l'activityPrincipale che gestisce i tabhost, che lancia come default il tabhost contenente la welcome Activity.

Forse è in questo passaggio che si perde il valore... ?

Il log gia lo conosco.. e l'ho gia fatto..
Prima di passarlo il valore c'è, quanto cerco di recuperarlo mi da null!

P.s.
Seguendo il tuo suggerimento ho provato a passare direttamente la variabile a WelcomeActivity, ed effettivamente li lo passa il valore. A questo punto credo che dovrei trasportare la variabile nell'activity principale  e poi da quella trasportarla a welcome activity se è possibile.
« Ultima modifica: 28 Dicembre 2011, 14:16:42 CET da dr4gone »

Offline dr4gone

  • Utente junior
  • **
  • Post: 66
  • Respect: +1
    • Mostra profilo
Re:Problema passaggio dato ottenuto da un parsing, tra due activity
« Risposta #5 il: 29 Dicembre 2011, 10:32:51 CET »
0
Mi sono passato un po di tempo e ho ricreato tutto semplificandolo, per darvi un'idea complessiva di quello che succede anche visivamente ho allegato una demo che ricrea la situazione..

In questo file che ho allegato si ricrea la situazione che vorrei io, ma non ottengo i dati.

Cambiando nell'activity Avvio :
Codice (Java): [Seleziona]
intent = new Intent(getApplicationContext(), Principale.class);con questo:
Codice (Java): [Seleziona]
intent = new Intent(getApplicationContext(), Tab1.class);
Ottengo il risultato della variabile, ma non la cosa che volevo ottenere, cioè visualizzare il tutto dentro il tablayout.

(se eseguite il progetto capirete subito di cosa sto parlando)

Ho cercato in vano di cercare di portare il valore da Avvio ---> a Principale ----> a Tab1 , pensando di fare una cosa del genere...

Nella classe Principale fare una spece di "ponte" che prenda la variabile dall'avvio, la memorizzi e la rimandi al Tab1
 
Codice (Java): [Seleziona]
Intent intent=getIntent(); // l'intent dell'activity principale
                String pkg=getPackageName();
                String s = intent.getStringExtra(pkg+"token");
                intent.putExtra(pkg+"token1", s);
                startActivity(intent);

e poi nella classe Tab1 cambiare la chiave in "token1" ma nn va ugualmente.

ma non riesco a capire come gestire il fatto che gia i tab mi cambiano con gli intent per cambiare le varie activity, p
Questa cosa mi provoca un po di confusione.
ho provato ad inserire il codice postato sopra, dentro l'intent che fa partire la Tab1 dall'activity principale .. ma nulla.. ottengo sempre null

Suggerimenti su cosa possa fare?


Offline dr4gone

  • Utente junior
  • **
  • Post: 66
  • Respect: +1
    • Mostra profilo
Re:Problema passaggio dato ottenuto da un parsing, tra due activity
« Risposta #6 il: 08 Gennaio 2012, 11:25:02 CET »
0
Ho risolto con l'uso delle variabili globali, con extends Application.
Grazie Comunque