Autore Topic: Importare parametri tra Activity  (Letto 602 volte)

Offline Fedebro

  • Nuovo arrivato
  • *
  • Post: 13
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy s4
  • Sistema operativo:
    Windows 10
Importare parametri tra Activity
« il: 12 Settembre 2016, 12:09:23 CEST »
0
Buongiorno ragazzi, inizio con il dire che sono nuovo nella programmazione android,
ho un problema con cui sto smanettando da diversi giorni.

Sto creando un applicazione simile ad una weather app (visualizzazione meteo) utilizzando le API messe a disposizione di openweathermap.
L'utente visualizzerà diverse schermate a sua scelta di diverse località.
Ogni località ha le sue coordinate gps da inserire nel link di richiesta API facente parte dell'activity FUNCTION.
Dato che le pagine da visualizzare (activity delle diverse località) sono tante ho pensato di inserire in una variabile di tipo String le coordinate e che tale variabile verrebbe semplicemente modificata dalle activity di appartenenza alle pagine delle località.
Il mio problema è che non riesco ad importare la variabile contenente le coordinate gps da LOCALITAESEMPIO.JAVA a FUNCTION.JAVA ne con gli intent (putExtra etc,) ne modificando la variabile direttamente dall'activity della località, la variabile inoltre deve essere di tipo static e perciò ho problemi anche con quest'ultimo parametro che non mi fa lavorare con le variabili non-static. Vi ringrazio e spero mi possiate aiutare.

FUNCTION.JAVA
Codice: [Seleziona]
public class Function extends AppCompatActivity {

    Intent i = getIntent();
    String weather_cord = i.getStringExtra("chiave1");

    //weather_cord è la variabile che dovrà contenere le coordinate gps da inserire nel link di richiesta
    private static final String OPEN_WEATHER_MAP_URL =
            "http://api.openweathermap.org/data/2.5/weather?"+weather_cord+"&lang=it&units=metric";
}

LOCALITAESEMPIO.JAVA
Codice: [Seleziona]
public class LOCALITàESEMPIO extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_LOCALITàESEMPIO);

        Intent myIntent = new Intent(this, LOCALITàESEMPIO.class);
        myIntent.putExtra("chiave1","coordinate gps"); //String

Offline Ohmnibus

  • Utente senior
  • ****
  • Post: 580
  • Respect: +130
    • Google+
    • @ohmnibus
    • Mostra profilo
    • Lords of Knowledge GdR
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Play Store ID:
    Ohmnibus
  • Sistema operativo:
    Windows 7 x64
Re:Importare parametri tra Activity
« Risposta #1 il: 13 Settembre 2016, 10:07:07 CEST »
0

Hai dimenticato di avviare l'activity

Codice (Java): [Seleziona]
startActivity(myIntent, 0);
e la lettura dell'intent si esegue di solito nella onCreate

Poi: quello che passi tramite bundle è una copia del dato originale. Se stai usando una variabile statica potresti esporla tramite getter/setter statici:

Codice (Java): [Seleziona]
public class LOCALITàESEMPIO extends AppCompatActivity {
  //...
  public static String getCoordinate() {
    return static_coordinate;
  }

  public static void setCoordinate(String coordinate) {
    static_coordinate = coordinate;
  }

  //...
}

poi accedi specificando il nome dell'activity:

Codice (Java): [Seleziona]
public class Function extends AppCompatActivity {

  //...
  String weather_cord = LOCALITàESEMPIO.getCoordinate();
  //...

}


P.S.: Rileggendo la tua richiesta mi sono sorti comunque alcuni dibbi. Cosa dovrebbe fare l'activity LOCALITàESEMPIO? E cosa dovrebbe fare Function?
Ohmnibus
Le mie app su Play Store

È stata trovata una soluzione al tuo problema? Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato.

Offline Fedebro

  • Nuovo arrivato
  • *
  • Post: 13
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy s4
  • Sistema operativo:
    Windows 10
Re:Importare parametri tra Activity
« Risposta #2 il: 13 Settembre 2016, 10:45:17 CEST »
0
Ciao, innanzitutto grazie per la risposta.
Ho provato il codice da te fornito e sembrerebbe funzionare ma ora ti spiego il mio problema,
immagina un'applicazione con tante località ed ogni località sia un activity,
in ogni schermata rappresentante delle informazioni su una determinata località è presente anche un dato che ne tratta il meteo, per quello esiste un unico activity chiamato FUNCTION che elabora i dati JSON meteo (temperatura, vento etc...)  scaricati da openweathermap.org in tempo reale.

Il codice
Codice (Java): [Seleziona]
public class Function extends AppCompatActivity {

  //...
  String weather_cord = LOCALITàESEMPIO.getCoordinate();
  //...

}
fa il suo dovere il mio problema è che di activity FUNCTION ce ne sta uno solo e che ogni volta dovrà importare le coordinate di diverse località da diverse activity ( LOCALITàESEMPIO1,  LOCALITàESEMPIO2,  LOCALITàESEMPIO3,  etc...), inoltre nella FUNCTION non esiste onCreate trattasi di una classe che elabora semplicemente delle informazioni e le reinvia all'activity LOCALITàESEMPIO1 che le richiede tramite
Codice (Java): [Seleziona]
public interface AsyncResponse {

        void processFinish(String output1, String output2, String output3, String output4, String output5, String output6, String output7, String output8, String output9, String output10);
    }



Post unito: 13 Settembre 2016, 11:00:13 CEST
In pratica vorrei sapere se si può creare una variabile statica in comune tra tutte le classi, che verra puntualmente modificata da LOCALITàESEMPIO(n) ogni volta che la si visualizzerà, senza specificare su FUNCTION su quale LOCALITàESEMPIO la si deve leggere. Grazie
« Ultima modifica: 13 Settembre 2016, 11:00:13 CEST da fedebro, Reason: Merged DoublePost »

Offline Ohmnibus

  • Utente senior
  • ****
  • Post: 580
  • Respect: +130
    • Google+
    • @ohmnibus
    • Mostra profilo
    • Lords of Knowledge GdR
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Play Store ID:
    Ohmnibus
  • Sistema operativo:
    Windows 7 x64
Re:Importare parametri tra Activity
« Risposta #3 il: 13 Settembre 2016, 11:18:33 CEST »
0

Ok, in effetti mi era venuto il dubbio.

Quello che vuoi fare è un po' strano... perché non fai restituire le coordinate modificate da processFinish?

In alternativa (molto sporca in verità) puoi avviare Function usando startActivityForResult, così facendo sempre da Function puoi ottenere un riferimento alla tua activity tramite getCallingActivity(). Fai implementare a tutti i chiamanti una stessa interfaccia così hai modo di accedere ai getter/setter definiti nell'interfaccia.

Codice (Java): [Seleziona]
public interface Localita {
  String getCoordinates();
  void setCoordinates(String coordinates);
}

public class LOCALITàESEMPIO extends AppCompatActivity implements Localita {

  //...
  public String getCoordinates() {
    return static_coordinate;
  }

  public void setCoordinates(String coordinate) {
    static_coordinate = coordinate;
  }
  //...

}

public class Function extends AppCompatActivity {
  Localita caller = (Localita)getCallingActivity();

  //...
  String weather_cord = caller.getCoordinates();
  //...
  caller.setCoordinates(weather_cord);
  //...
}
Ohmnibus
Le mie app su Play Store

È stata trovata una soluzione al tuo problema? Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato.

Offline Fedebro

  • Nuovo arrivato
  • *
  • Post: 13
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy s4
  • Sistema operativo:
    Windows 10
Re:Importare parametri tra Activity
« Risposta #4 il: 13 Settembre 2016, 14:48:23 CEST »
0
Ho provato ad utilizzare la funzione ProcessFinish ma purtroppo mi da ancora errore o comunque non mi passa le informazioni.
Ti posto il codice non capisco dove sbaglio, grazie

Codice (Java): [Seleziona]
public class LOCALITàESEMPIO extends AppCompatActivity {
//...
Function.placeIdTask asyncTask =new Function.placeIdTask(new Function.AsyncResponse() {
            public void processFinish(String weather_city, String weather_updatedOn, String weather_description, String weather_temperature, String weather_humidity, String weather_pressure, String weather_iconText, String sun_rise, String weather_wind, String wind_condition, String weather_cord) {

                weather_cord="lat=41.9033&lon=12.5009";
                cityField.setText(weather_city);
                updatedField.setText(weather_updatedOn);
                detailsField.setText(weather_description);
                currentTemperatureField.setText(weather_temperature+"C");
                humidity_field.setText("Umidità: "+weather_humidity);
                pressure_field.setText("Pressione: "+weather_pressure);
                wind_field.setText("Vento: "+weather_wind+ "km/h");
                wind_cond.setText("(" + wind_condition + ")");

                weatherIcon.setText(Html.fromHtml(weather_iconText));

            }
        });
//...
//...

Codice (Java): [Seleziona]
public class Function extends AppCompatActivity{

public static String weather_cord;

    private static final String OPEN_WEATHER_MAP_URL =
            "http://api.openweathermap.org/data/2.5/weather?" + weather_cord + "&lang=it&units=metric";

//...

public interface AsyncResponse {

        void processFinish(String output1, String output2, String output3, String output4, String output5, String output6, String output7, String output8, String output9, String output10, String input11);
    }

 public static class placeIdTask extends AsyncTask<String, Void, JSONObject> {

        public AsyncResponse delegate = null;

        public placeIdTask(AsyncResponse asyncResponse) {
            delegate = asyncResponse;
        }

//...

@Override
        protected void onPostExecute(JSONObject json) {

            try {
                if(json != null){
                   
//...

                    delegate.processFinish(city, updatedOn, description, temperature, humidity, pressure, iconText, ""+ (json.getJSONObject("sys").getLong("sunrise") * 1000), windspeed, wind_condition, weather_cord);
                }
            } catch (JSONException e) {
                //Log.e(LOG_TAG, "Cannot process JSON results", e);
            }


        }

Offline Ohmnibus

  • Utente senior
  • ****
  • Post: 580
  • Respect: +130
    • Google+
    • @ohmnibus
    • Mostra profilo
    • Lords of Knowledge GdR
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Play Store ID:
    Ohmnibus
  • Sistema operativo:
    Windows 7 x64
Re:Importare parametri tra Activity
« Risposta #5 il: 13 Settembre 2016, 15:08:21 CEST »
0
Che errore viene fuori? A me sembra tutto a posto.

Ohmnibus
Le mie app su Play Store

È stata trovata una soluzione al tuo problema? Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato.

Offline Fedebro

  • Nuovo arrivato
  • *
  • Post: 13
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy s4
  • Sistema operativo:
    Windows 10
Re:Importare parametri tra Activity
« Risposta #6 il: 13 Settembre 2016, 15:12:56 CEST »
0
Nessun errore il problema è che non mi visualizza la variabile sull'altra activity, in pratica la variabile rimane vuota, e mi chiedo se ho utilizzato bene il process finish...

Offline Ohmnibus

  • Utente senior
  • ****
  • Post: 580
  • Respect: +130
    • Google+
    • @ohmnibus
    • Mostra profilo
    • Lords of Knowledge GdR
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Play Store ID:
    Ohmnibus
  • Sistema operativo:
    Windows 7 x64
Re:Importare parametri tra Activity
« Risposta #7 il: 13 Settembre 2016, 15:27:47 CEST »
0
cambia

Codice (Java): [Seleziona]
public placeIdTask(AsyncResponse asyncResponse) {
  delegate = asyncResponse;
}

in

Codice (Java): [Seleziona]
public placeIdTask(String coord, AsyncResponse asyncResponse) {
  weather_cord = coord; //Coordinate passate dall'activity
  delegate = asyncResponse;
}

eppoi cambia

Codice (Java): [Seleziona]
Function.placeIdTask asyncTask =new Function.placeIdTask(new Function.AsyncResponse() {
            public void processFinish(String weather_city, String weather_updatedOn, String weather_description, String weather_temperature, String weather_humidity, String weather_pressure, String weather_iconText, String sun_rise, String weather_wind, String wind_condition, String weather_cord) {

                weather_cord="lat=41.9033&lon=12.5009";
                cityField.setText(weather_city);
                updatedField.setText(weather_updatedOn);
                detailsField.setText(weather_description);
                currentTemperatureField.setText(weather_temperature+"C");
                humidity_field.setText("Umidità: "+weather_humidity);
                pressure_field.setText("Pressione: "+weather_pressure);
                wind_field.setText("Vento: "+weather_wind+ "km/h");
                wind_cond.setText("(" + wind_condition + ")");

                weatherIcon.setText(Html.fromHtml(weather_iconText));

            }
        });

in

Codice (Java): [Seleziona]
Function.placeIdTask asyncTask =new Function.placeIdTask("lat=41.9033&lon=12.5009", //Passo le coordinate all'asynctask
       new Function.AsyncResponse() {
            public void processFinish(String weather_city, String weather_updatedOn, String weather_description, String weather_temperature, String weather_humidity, String weather_pressure, String weather_iconText, String sun_rise, String weather_wind, String wind_condition, String weather_cord) {

                LOCALITàESEMPIO.weather_cord=weather_cord; //Leggo le coordinate restituite
                cityField.setText(weather_city);
                updatedField.setText(weather_updatedOn);
                detailsField.setText(weather_description);
                currentTemperatureField.setText(weather_temperature+"C");
                humidity_field.setText("Umidità: "+weather_humidity);
                pressure_field.setText("Pressione: "+weather_pressure);
                wind_field.setText("Vento: "+weather_wind+ "km/h");
                wind_cond.setText("(" + wind_condition + ")");

                weatherIcon.setText(Html.fromHtml(weather_iconText));

            }
        });
Ohmnibus
Le mie app su Play Store

È stata trovata una soluzione al tuo problema? Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato.

Offline Fedebro

  • Nuovo arrivato
  • *
  • Post: 13
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy s4
  • Sistema operativo:
    Windows 10
Re:Importare parametri tra Activity
« Risposta #8 il: 13 Settembre 2016, 16:13:38 CEST »
0
ho fatto esattamente quello che mi hai suggerito, non dichiarando la variabile weather_cord su LOCALITàESEMPIO mi da il seguente errore:

Codice (Java): [Seleziona]
Function.placeIdTask asyncTask =new Function.placeIdTask("lat=42.3412&lon=13.8359",
                new Function.AsyncResponse() {
                    public void processFinish(String weather_city, String weather_updatedOn, String weather_description, String weather_temperature, String weather_humidity, String weather_pressure, String weather_iconText, String sun_rise, String weather_wind, String wind_condition, String weather_cord) {

                        LOCALITàESEMPIO.weather_cord=weather_cord;  //mi dà errore LOCALITàESEMPIO.weather_cord
                        cityField.setText(weather_city);
                        updatedField.setText(weather_updatedOn);
                        detailsField.setText(weather_description);
                        currentTemperatureField.setText(weather_temperature+"C");
                        humidity_field.setText("Umidità: "+weather_humidity);
                        pressure_field.setText("Pressione: "+weather_pressure);
                        wind_field.setText("Vento: "+weather_wind+ "km/h");
                        wind_cond.setText("(" + wind_condition + ")");

                        weatherIcon.setText(Html.fromHtml(weather_iconText));

                    }
                });

dichiarando invece su LOCALITàESEMPIO la variabile:
Codice (Java): [Seleziona]
public static String weather_cord = null;l'errore scompare e parte il debug, ma non restituisce risultati. Forse dovuto alla dichiarazione della variabile impostato su null?

Offline Ohmnibus

  • Utente senior
  • ****
  • Post: 580
  • Respect: +130
    • Google+
    • @ohmnibus
    • Mostra profilo
    • Lords of Knowledge GdR
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Play Store ID:
    Ohmnibus
  • Sistema operativo:
    Windows 7 x64
Re:Importare parametri tra Activity
« Risposta #9 il: 13 Settembre 2016, 16:27:35 CEST »
0

Non avendo una visione di insieme non so come aiutarti oltre.

Considera che il giro è questo:

La tua attività (es. LOCALITàESEMPIO) istanzia un Function.placeIdTask passandogli le coordinate da utilizzare ed il listener.

L'istanza di Function.placeIdTask esegue le elaborazioni e, suppongo, modifica le coordinate ricevute (altrimenti è inutile che le restituisca indietro).

Una volta completata la sua attività, invoca delegate, ossia il listener passato come riferimento al costruttore.

Il listener ascolta la risposta di Function.placeIdTask non appena questa è pronta. Tra i vari parametri in risposta ci sono le coordinate modifcate da Function.placeIdTask.
Ohmnibus
Le mie app su Play Store

È stata trovata una soluzione al tuo problema? Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato.

Offline Fedebro

  • Nuovo arrivato
  • *
  • Post: 13
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy s4
  • Sistema operativo:
    Windows 10
Re:Importare parametri tra Activity
« Risposta #10 il: 13 Settembre 2016, 16:47:21 CEST »
0
In effetti non serve che Function reinvii le coordinate alle altre activity,
perchè le coordinate gli servono per inserirle nel link per richiedere le condizioni meteo di quelle determinate coordinate.
Una volta ricevute ed elaborate le condizioni meteo (basandosi sul web), FUNCTION restituisce le condizioni meteo alle LOCALITà.
Non saprei come gestire i dati,
in breve:

-LOCALITàESEMPIO1 invia le coordinate a FUNCTION,
-FUNCTION elabora le coordinate ma non le reinvia (bensì le cancella)*
-FUNCTION invia i risultati a LOCALITàESEMPIO1 (che andrà a farli visualizzare all'utente)

*FUNCTION deve cancellare le coordinate o comunque sovrascriverle all'arrivo di nuove coordinate da LOCALITàESEMPIO2 per un nuovo ciclo


Offline Ohmnibus

  • Utente senior
  • ****
  • Post: 580
  • Respect: +130
    • Google+
    • @ohmnibus
    • Mostra profilo
    • Lords of Knowledge GdR
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Play Store ID:
    Ohmnibus
  • Sistema operativo:
    Windows 7 x64
Re:Importare parametri tra Activity
« Risposta #11 il: 13 Settembre 2016, 17:07:06 CEST »
0
Hai comunque tutti i dati a disposizione.

Function.placeIdTask riceve di sicuro le coordinate perché glie le passi nel costruttore.

Se i risultati non tornano il problema è altrove.
Ohmnibus
Le mie app su Play Store

È stata trovata una soluzione al tuo problema? Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato.

Offline Fedebro

  • Nuovo arrivato
  • *
  • Post: 13
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy s4
  • Sistema operativo:
    Windows 10
Re:Importare parametri tra Activity
« Risposta #12 il: 13 Settembre 2016, 18:31:13 CEST »
0
Dopo tanti test mi sono accorto tramite il LogCat che effettivamente le coordinate gli arrivano, solo ho paura che lo scambio arrivi nello stesso istante e dato che senza coordinate FUNCTION non può elaborare mi fa pensare che risponda con dati vuoti, ecco spiegato il mancato risultato, come posso fare a far si che FUNCTION riceva prima i dati, li elabori, e poi reinvii la risposta?
Ti ringrazio

Post unito: 13 Settembre 2016, 18:33:15 CEST
FUNCTION non ha i dati pronti, gli servono le coordinate per aggiungerle al link di richiesta API.
« Ultima modifica: 13 Settembre 2016, 18:33:15 CEST da fedebro, Reason: Merged DoublePost »

Offline Ohmnibus

  • Utente senior
  • ****
  • Post: 580
  • Respect: +130
    • Google+
    • @ohmnibus
    • Mostra profilo
    • Lords of Knowledge GdR
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Play Store ID:
    Ohmnibus
  • Sistema operativo:
    Windows 7 x64
Re:Importare parametri tra Activity
« Risposta #13 il: 14 Settembre 2016, 10:37:38 CEST »
0
Mi ripeteresti perché Funcition estende AppCompatActivity?
Ohmnibus
Le mie app su Play Store

È stata trovata una soluzione al tuo problema? Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato.

Offline Fedebro

  • Nuovo arrivato
  • *
  • Post: 13
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy s4
  • Sistema operativo:
    Windows 10
Re:Importare parametri tra Activity
« Risposta #14 il: 14 Settembre 2016, 13:22:42 CEST »
0
Buongiorno, ho esteso AppCompatActivity su FUNCTION perchè sennò non mi riconosceva Intent PutExtra, non so il motivo, effettivamente senza AppCompatActivity se specifico manualmente le coordinate in fase di test funzionava lo stesso, purtroppo sto studiando da poco programmazione...sorry
Sono arrivato a buon punto ma ancora riesco bene nel mio intento come dicevo nell'ultimo post lo scambio coordinate-dati meteo avviene nello stesso istante perciò FUNCTION restituisce dati nulli non avendoli ancora elaborati, se ci sarebbe un modo per posticipare l'invio di dati da FUNCTION ad ACTIVITY ho risolto, grazie.