Originariamente inviato da
soeca
Ragazzi sto avendo un problema con un'applicazione che sto cercando di fare. Questa applicazione quando premo un pulsante deve avviare una nuova Activity precisamente un Media Player semplicissimo e poverissimo di grafica....il problema sta nel fatto che non so come far restituire alla prima Activity il percorso e il brano scelto nella seconda activity (ossia nel media player!)! ho salvato in una stringa il percorso esatto con il nome della canzone( quindi per esempio in una variabile *PATH_NAME avrò /sdcard/NomeCanzone.mp3) ma come faccio a mandarlo all'activity chiamante??Grazie a tutti *
Ciao,
se ho ben capito, la tua Activity principale (che chiameremo Activity Padre) deve ricevere dati dall'Activity Secondaria (figlia)?
In tal caso è presto detto:
1) Di concetto, si tratta di avviare l'Activity Secondaria (dall'Activity Padre, ovviamente) utilizzando il metodo:
codice:
startActivityForResult(intent, requestCode);
in questo modo predisponi l'activity principale a ricevere qualcosa indietro quando termina l'activity figlia.
2)
Per catturare valori di ritorno dall'activity figlia, l'activity padre utilizza il metodo:
codice:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
[...]
}
che, con dei return_code univoci, riesce ad individuare i dati da prelevare dall'activity figlia.
3) Per contro, l'activity figlia, deve, prima di 'morire', preparare i dati da inviare indietro e consegnarli con il metodo:
codice:
setResult(RESULT_OK,intentReturnData);
In questo modo riesci a catturare i risultati.
In soldoni, vi è differenza nei metodi di start activity: differiscono nel caso l'invio dati è solo send o send/return.
Per farti un esempio semplice, considera queste due classi. La prima Activity lancia tramite un button la seconda e gli passa la stringa di testo contenuta nell'EditText del layout principale, ad essa associata.
Quando viene lanciata la seconda activity, figlia, questa prende i dati dalla prima con il metodo getIntent().getStringExtra("nomeStringa");
La seconda activity ha un layout uguale alla prima, solo che l'editText della seconda Activity conterrà il valore (in questo caso una stringa) da consegnare, al finish(), all'activity principale, cioè quella da cui è stata lanciata:
Activity Principale:
codice:
package lab.frank.app;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
public class ActivityPrincipale extends Activity {
Button pulsanteAvviaSecondaActivity;
EditText editText1;
Context contesto;
TextView textViewValoreDiRitorno;
int REQUEST_CODE = 0;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
contesto = this.getApplicationContext();
pulsanteAvviaSecondaActivity = (Button)findViewById(R.id.pulsanteActivitySecondaria);
editText1 = (EditText)findViewById(R.id.editText1);
textViewValoreDiRitorno = (TextView)findViewById(R.id.textViewValoreDiRitorno);
pulsanteAvviaSecondaActivity.setOnClickListener(new OnClickListener() {
public void onClick(View v){
Bundle bundle = new Bundle();
Intent intentSecondaActivity = new Intent(contesto, secondActivity.class);
bundle.putString("testoPrimaActivity", editText1.getText().toString());
intentSecondaActivity.putExtras(bundle);
startActivityForResult(intentSecondaActivity, REQUEST_CODE);
}
});
}// end onCreate
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode == RESULT_OK) {
textViewValoreDiRitorno.setText(data.getStringExtra("ValoreDiRitorno"));
}
}
}//end Class
Activity Secondaria:
codice:
package lab.frank.app;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
public class secondActivity extends Activity{
String testoRicevutoDaMainActivity;
TextView textViewTestoRicevutoDaPrimaActivity;
Context contesto;
Button pulsanteInviaStringaActivityPadre;
EditText editTextStringaDiRitorno;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.secondactivity);
contesto = this.getApplicationContext();
textViewTestoRicevutoDaPrimaActivity = (TextView)findViewById(R.id.textViewStringaProvenienteDaMainActivity);
textViewTestoRicevutoDaPrimaActivity.setText(getIntent().getStringExtra("testoPrimaActivity"));
pulsanteInviaStringaActivityPadre = (Button)findViewById(R.id.buttonInviaTextAdActivityPrincipale);
editTextStringaDiRitorno = (EditText)findViewById(R.id.editTextStringaDaInviareVersoActivityPrincipale);
pulsanteInviaStringaActivityPadre.setOnClickListener(new OnClickListener() {
public void onClick(View v){
Intent intentReturnData = new Intent();
intentReturnData.putExtra("ValoreDiRitorno", editTextStringaDiRitorno.getText().toString());
setResult(RESULT_OK,intentReturnData);
finish();
}
});
}
}
Layout Principale assegnato alla prima Activity con metodo setContentView in fase di OnCreate():
codice:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<EditText
android:id="@+id/editText1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ems="10"
android:hint="Text da passare a SecondActivity..." >
<requestFocus />
</EditText>
<Button
android:id="@+id/pulsanteActivitySecondaria"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Avvia Activity Secondaria" />
<TextView
android:id="@+id/textViewValoreDiRitorno"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="TextView" />
</LinearLayout>
Layout secondario assegnato alla seconda Activity (figlia) con metodo setContentView in fase di OnCreate():
codice:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<TextView
android:id="@+id/textViewStringaProvenienteDaMainActivity"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="TextView" />
<EditText
android:id="@+id/editTextStringaDaInviareVersoActivityPrincipale"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ems="10"
android:hint="Text da inviare all'activity principale" >
<requestFocus />
</EditText>
<Button
android:id="@+id/buttonInviaTextAdActivityPrincipale"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Invia Testo Ad Activity Principale" />
</LinearLayout>
(in androidmanifest.xml chiaramente entrambe le activity vanno dichiarate, ma non credo sia un problema per te).
Nell'esempio puoi valutare a fondo l'utilizzo dei metodi per lanciare le activity e delle tecniche per inviare e ricevere dati (in questo caso ho usato Bundle in pasto all'Intent di ritorno).
Spero sia tutto chiaro
Ciao!