Autore Topic: Passaggio parametri tra Activity  (Letto 2124 volte)

Offline Darèios89

  • Utente junior
  • **
  • Post: 68
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    LG G2
Passaggio parametri tra Activity
« il: 06 Settembre 2012, 00:08:11 CEST »
0
Ho un problema grande, nella mia applicazione vorrei usare un menù con una voce in cui cliccando faccio una scansione delle reti wifi usando una
 List<ScanResult> in cui memorizzo i risultati, poi vorrei avviare dal menù un' altra activity che ottiene quella lista, e la usa per elaborare l' arrayadapter per la ListView in cui visualizzare l' elenco delle reti. Il problema è che tra gli intent il metodo putExtras non è compatibile, o meglio i parametri non supportano la List<ScanResult>, e non so come rendere Serializable una struttura dati di default. C' è un modo per passare questo oggetto List<ScanResult> ? Ho provato creando un oggetto di tipo
Codice: [Seleziona]
Progetto element=new Progetto() con cui accedere alle variabili di istanza dall' altra activity, ma ovviamente i valori restano a null....

jfrankie

  • Visitatore
Re:Passaggio parametri tra Activity
« Risposta #1 il: 06 Settembre 2012, 12:29:06 CEST »
+1
usa l'interfaccia Parcelable. Vedi qui che ho fatto un esempio di come usarla http://www.survivingwithandroid.com/2012/09/passing-data-between-activities.html

Offline Darèios89

  • Utente junior
  • **
  • Post: 68
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    LG G2
Re:Passaggio parametri tra Activity
« Risposta #2 il: 06 Settembre 2012, 12:56:39 CEST »
0
Si ma i miei oggetti da passare come parametro non sono oggetti di una classe creata da me, come Person, sono dati predefiniti, cioè la mia è una List<ScanResult>, come faccio a fare implementare una interfaccia ad un tipo di dato standard? Dovrei crearmi una classe tutta mia che fa le stesse cose della List<ScanResult> di default e che implementa Parcelable?

jfrankie

  • Visitatore
Re:Passaggio parametri tra Activity
« Risposta #3 il: 06 Settembre 2012, 13:22:49 CEST »
+1
Puoi fare una classe che la estende e ci passi i valori oppure una classe tutta tua.
Oppure una sorta di wrapper che utilliza la ScanResult per leggere i dati e poi li scrive sul parcel.

Codice (Java): [Seleziona]
public class Wrapper implements Parcelable {
   List....

  e qui implementi i metodi del Parcelable per "serializzare"/deserializzare (CREATOR)
}

Offline Darèios89

  • Utente junior
  • **
  • Post: 68
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    LG G2
Re:Passaggio parametri tra Activity
« Risposta #4 il: 06 Settembre 2012, 22:15:24 CEST »
0
O_o

Non riesco a capire cosa fare, cosa implementare, e cosa passare!!! Devo solo prendere una struttura intera dove ho inserito gli elementi e passare quella, ma non so come implementare....

Offline supertommino

  • Utente junior
  • **
  • Post: 77
  • Respect: +12
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    supertommino
Re:Passaggio parametri tra Activity
« Risposta #5 il: 06 Settembre 2012, 22:23:22 CEST »
+1
Un a statica?

Offline Darèios89

  • Utente junior
  • **
  • Post: 68
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    LG G2
Re:Passaggio parametri tra Activity
« Risposta #6 il: 06 Settembre 2012, 22:28:19 CEST »
0
Un a statica?

?

Mi manca solo questa parte per completare un lavoro, maledizione, che cosa complicata per fare un niente......

Ho provato con:

Codice: [Seleziona]
import java.util.List;

import android.net.wifi.ScanResult;
import android.os.Parcel;
import android.os.Parcelable;

public class Lista implements Parcelable {
           
       
        List<ScanResult> tmplist;

       
         @Override
     public int describeContents() {
             // TODO Auto-generated method stub
             return 0;
     }
     @Override
     public void writeToParcel(Parcel dest, int flags) {
             // TODO Auto-generated method stub
             
     }
     
     public static final Parcelable.Creator CREATOR =
                     new Parcelable.Creator() {
                     public Lista createFromParcel(Parcel in) {
                     return new Lista(in);
                     }
                     public Lista[] newArray(int size) {
                     return new Lista[size];
                     }
                     };
}


Ma qui
Codice: [Seleziona]
         return new Lista(in); mi dà errore nel costruttore....
« Ultima modifica: 06 Settembre 2012, 22:36:39 CEST da Darèios89 »

jfrankie

  • Visitatore
Re:Passaggio parametri tra Activity
« Risposta #7 il: 07 Settembre 2012, 09:19:45 CEST »
+1
Ti dà errore perchè ti manca il costruttore:
 
Codice (Java): [Seleziona]
public Lista(Parcel in) {
  // qui ricostruisci la tua lista
}

Altrimenti se vuoi fare presto crea una classe statica ed è fatta, ci metti dentro la tua lista e la recuperi dall'altra attività
Funziona anche in questo modo e non perdi tempo con i Parcel. Se non trovi il modo ti consiglio di utilizzare questa modalità
Ciao

Offline supertommino

  • Utente junior
  • **
  • Post: 77
  • Respect: +12
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    supertommino
Re:Passaggio parametri tra Activity
« Risposta #8 il: 07 Settembre 2012, 12:48:49 CEST »
+1
Ti dà errore perchè ti manca il costruttore:
 
Codice (Java): [Seleziona]
public Lista(Parcel in) {
  // qui ricostruisci la tua lista
}

Altrimenti se vuoi fare presto crea una classe statica ed è fatta, ci metti dentro la tua lista e la recuperi dall'altra attività
Funziona anche in questo modo e non perdi tempo con i Parcel. Se non trovi il modo ti consiglio di utilizzare questa modalità
Ciao

La statica che appunto gli ho consigliato io il post precedente   :-)
Praticamente recuperi da una classe una cosa che si trova in un'altra scrivendo
Codice (Java): [Seleziona]
nomeclasse.variabilechetiinteressa

Offline Darèios89

  • Utente junior
  • **
  • Post: 68
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    LG G2
Re:Passaggio parametri tra Activity
« Risposta #9 il: 08 Settembre 2012, 20:37:38 CEST »
0
Ma può funzionare se invece dichiaro una Lista statica e non creando una classe apposita? In ogni caso non riesco a dichiarare nulla static, nemmeno le classi, mi viene detto che è permesso solo final, e qualcos' altro....

Offline supertommino

  • Utente junior
  • **
  • Post: 77
  • Respect: +12
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    supertommino
Re:Passaggio parametri tra Activity
« Risposta #10 il: 10 Settembre 2012, 17:12:00 CEST »
+1
Dichiarele fuori dalla "funzione"
 :-)

Offline Darèios89

  • Utente junior
  • **
  • Post: 68
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    LG G2
Re:Passaggio parametri tra Activity
« Risposta #11 il: 10 Settembre 2012, 19:54:41 CEST »
0
Dichiarele fuori dalla "funzione"
 :-)

Risolto, il problema era  un nullpointer dovuto al fatto che sbagliavo nel setContentview il file xml.....ora questo è il codice:

Codice: [Seleziona]


import java.util.List;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.net.wifi.ScanResult;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;

public class Risultati extends Activity {
       

        int geoLat;
        int geoLng;
        private ArrayAdapter<String> arrayAdapter;
       
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
       
        Intent intent = getIntent();
        String pkg = getPackageName();
       geoLat = intent.getIntExtra(pkg+".myLat" , -1);
       geoLng = intent.getIntExtra(pkg+".myLng" , -1);
       
             
        Context tmpContext=getApplicationContext();
       
                        arrayAdapter = new ArrayAdapter<String>(
                            this, R.layout.listitem, R.id.listItemTextView
                            );
       
        ListView listView = (ListView)findViewById(R.id.miaLista);
        List<ScanResult> tmplist=Progetto.tmplist;
       
         
                for (ScanResult result : tmplist)
                {
                        String tot="";
                       
                        String SSID=result.SSID;
                        String BSSID=result.BSSID;
                        String capabilities=result.capabilities;
                        int frequency=result.frequency;
                        int level=result.level;
                       
                        tot+="Tipo: WiFi\n"+"SSID: "+SSID+"\n"+"BSSID: "+BSSID+"\n"+"Chiave: "
                        +capabilities+"\n"+"Frequenza: "+frequency+" MHz\n"+"Potenza: "+level+" dBm"
                        +"Latitudine: "+geoLat+"\n"+"Longitudine: "+geoLng;
                       
                           
                        arrayAdapter.add(tot);
                               
                }

               
       
        ConnectivityManager connectivityManager = (ConnectivityManager)tmpContext.getSystemService(Context.CONNECTIVITY_SERVICE);
            NetworkInfo networkInfo = null;
            if (connectivityManager != null) {
                networkInfo = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
            }
           
            if(networkInfo!=null)
            {
                   
                   
                    String tot="Tipo: "+networkInfo.getTypeName()+"\n"+"Stato: "+networkInfo.getState()+
                                    "\n"+"Errori: "+networkInfo.getReason()+"\n"+"Extra: "+networkInfo.getExtraInfo()+
                                    "\n"+"Attiva: "+networkInfo.isConnected()+"\n"+"Disponibile: "+networkInfo.isAvailable()
                                    +"Latitudine: "+geoLat+"\n"+"Longitudine: "+geoLng;
                   
                   
                    arrayAdapter.add(tot);
            }
       
           
            listView.setAdapter(arrayAdapter);
         
    }
}
   

Però io non riesco a vedere nella listview alcuna scritta Textview che la precede, riporto gli xml:

listview.xml

Codice: [Seleziona]
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

   
     <ListView
                 android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:id="@+id/miaLista" />


</RelativeLayout>


E listitem.xml che userà il mio adapter:

Codice: [Seleziona]
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content">

    <TextView
        android:id="@+id/listItemTextView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:padding="5pt"
        android:textSize="10pt"
        android:text="@string/Text">
       
    </TextView>
   

</LinearLayout>

Uso una risorsa String, ma non si legge nulla...si vede solo la lista con gli elementi senza scritta textview...
« Ultima modifica: 10 Settembre 2012, 20:37:34 CEST da Darèios89 »