Rappel, il est préférable de placer dans une « class » toutes les fonctions qui sont utilisées plus d’une fois dans un programme.
Pour ce faire, il faut déclarer la class :
package com.xxx;
import xxxx;
public class Utilxxx {
public Utilxxx (Context context){
............
Et l’utiliser :
Utilxxx.ma_fonction();
Pour appeler un sous-programme, on utilise la technologie des INTENTS :
1°) Dans le programme qui appel :
On écrit dans la partie du code qui appelle le sous programme (pour un appel avec passage de données en variable)
Intent intent = new Intent(<<Activity-mére>>.this, <<Activity-fille>>.class);
intent.putExtra("var1",<<contenu-variable1>>);
startActivityForResult(intent,<<variable-de-type-“static final int”>>);
Et on ajoute pour traiter les retours la fonction :
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) { int var1;
if (requestCode == <<variable-de-type-“static final int”>>)
{ if (resultCode == RESULT_OK)
{if (data.hasExtra("returnSauv"))
{var1=data.getExtras().getInt("returnSauv");
Toast.makeText(this, "Mémoire = "+String.valueOf(memAnn),Toast.LENGTH_SHORT).show();
}
}
}
}
2°) Dans le programme appelé :
public class AfficDetail extends Activity {
private static int Var1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.<<layout>>);
Bundle extras = getIntent().getExtras();
Var1= extras.getInt("var1");
//--Traitement…
}
@Override
public void finish() {
// Prepare data intent
Intent data = new Intent();
data.putExtra("returnSauv", Var1);
// Activity finished ok, return the data
setResult(RESULT_OK, data);
super.finish();
}
}
Pour un appel simple (sans passage de variable ni récupération de données) simplement écrire :
Intent myIntent = new Intent(this, AddNewActivity.class);
startActivity(myIntent);
3°) N’oubliez pas de modifier le fichier manifest de votre application
Insérez entre la balise </activity> de l’activité principale et avant la balise </application>
<activity android:name=".<nom_de_l'activité>"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.DEFAULT" />
</intent-filter>
</activity>
Remarque, tous les types de données peuvent être passées. Par contre pour les objets complexes (classes ou tableaux multidimentionnels,..) il faut utiliser la technique du « parce ». Sinon, il est possible et plus optimal de créer une base de données et de l’utiliser dans les activités.
a) Ajouter dans la classe à « parcer » :
Les imports :
import android.os.Parcel;
import android.os.Parcelable;
Le type « parcelable » :
public class maClasse implements Parcelable{
Et le code suivant :
///// Parcelling
public maClasse(Parcel in){
String[] data = new String[3];
in.readStringArray(data);
this.id = data[0];
this.nom = data[1];
this.prenom = data[2];
}
@override
public int describeContents(){
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeStringArray(new String[] {this.id,
this.nom,
this.prenom});
}
public static final Parcelable.Creator CREATOR = new Parcelable.Creator() {
public maClasse createFromParcel(Parcel in) {
return new maClasse(in);
}
public maClasse[] newArray(int size) {
return new maClasse[size];
}
};
b) Passage de paramétre :
intent.putExtra("Objet_de_type_maClasse",Objet_de_type_maClasse); c) Récupération dans l'activité réceptionniste :
Bundle data = getIntent().getExtras(); maClasse objet_de_type_maClasse = data.getParcelable("
Objet_de_type_maClasse");
4°) Pour un appel à partir d’une classe (exemple dans un phone Listner) :
Intent delintent= new Intent(context, delNumber.class);
delintent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
ctx.startActivity(delintent);
Avec ctx :
public <Nom de la Classe>(Context ctx) { this.ctx = ctx; callStateListener = new CallStateListener(); outgoingReceiver = new OutgoingReceiver(); }
Votre commentaire