I want to pass an array of objects without using the preference
I use Intent!!!
The Object class Bts
public class Bts implements Serializable {
int idbts;
String nombts;
String ipaddress;
String logb;
String pawb;
int xbts;
int ybts;
public Bts(int idbts, String nombts, String ipaddress, String logb,
String pawb, int xbts, int ybts) {
super();
this.idbts = idbts;
this.nombts = nombts;
this.ipaddress = ipaddress;
this.logb = logb;
this.pawb = pawb;
this.xbts = xbts;
this.ybts = ybts;
}
//wthis setter and getter
}
The source activity
Ps:JSONParseBts filled listeBts.
public class ApresConnextionActivity extends Activity {
public Bts[] listeBts;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
super.setContentView(R.layout.apresconnect);
final Button btsButton = (Button) findViewById(R.id.btbts);
//boutonbts
btsButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Log.w("myApp",""+listeBts.length);
Intent i = new Intent(ApresConnextionActivity.this, BtsBoutonActivity.class);
i.putExtra("tabbts",listeBts);
startActivity(i);
}
});
new JSONParseBts().execute();
}
public class JSONParseBts extends AsyncTask<String, String, JSONObject> { ... }
}
And distination Activity:
public class BtsBoutonActivity extends Activity {
cellule[] listecellule;
Bts[] listeBts;
int i,xx=0;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
super.setContentView(R.layout.btsbouton);
Bundle b = getIntent().getExtras();
if (b != null)
{
Bts[] listeBts = (Bts[])b.getSerializable("tabbts") ;
Log.w("myApp",""+listeBts.length);
}else{
Log.w("myApp","you have problem");
}
/* Intent intent = getIntent();
listeBts = (Bts[])intent.getSerializableExtra("tabbts");*/
final Button[] b = new Button[listeBts.length];
LinearLayout ll3 = (LinearLayout)findViewById(R.id.linearLayout2); // Btn
for(i = 0; i < listeBts.length; i++){
//Log.w("myApp",listeBts[i].toString());
b[i] = new Button(BtsBoutonActivity.this);
b[i].setText(listeBts[i].getNombts());
xx =listeBts[i].getIdbts();
Log.w("myApp",""+xx);
b[i].setId(xx);
ll3.addView(b[i]);
final Button btbts = (Button) findViewById(xx);
btbts.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
Toast saved_message=Toast.makeText(BtsBoutonActivity.this,btbts.getText()+" "+btbts.getId(),1);
saved_message.show();
}});
}
}
}
The error is:
05-10 16:29:25.096: E/AndroidRuntime(819): java.lang.RuntimeException: Unable to start activity ComponentInfo{pfe.essat.com/pfe.essat.com.BtsBoutonActivity}: java.lang.ClassCastException: java.lang.Object[] cannot be cast to pfe.essat.objet.com.Bts[]
You can use a wrapper class that contains the Serializable array, I just tested this and it works.
First, create your simple wrapper class:
import java.io.Serializable;
public class BtsWrapper implements Serializable{
Bts[] array;
public BtsWrapper(Bts[] a){
array = a;
}
}
Then pass the Serializable wrapper class in the Intent:
btsButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Log.w("myApp",""+listeBts.length);
Intent i = new Intent(ApresConnextionActivity.this, BtsBoutonActivity.class);
BtsWrapper bWrapper = new BtsWrapper(listeBts); //added
i.putExtra("tabbts",bWrapper); //modified
startActivity(i);
}
});
Then, get the Serializable wrapper from the extras, and just extract the array:
Bundle b = getIntent().getExtras();
if (b != null)
{
//Bts[] listeBts = (Bts[])b.getSerializable("tabbts") ;
BtsWrapper bWrapper = (BtsWrapper) b.getSerializable("tabbts"); //added
Bts[] listeBts = bWrapper.array; //added
Log.w("myApp",""+listeBts.length);
}else{
Log.w("myApp","you have problem");
}
I believe there is no such putExtra API existent that accepts Array of some Serializable objects. See http://developer.android.com/reference/android/content/Intent.html#putCharSequenceArrayListExtra(java.lang.String, java.util.ArrayList) onwards. There is also no getter available for extracting Array of some Serializable objects from Intent.
You could perhaps make your Bts class Parcelable and use public Intent putExtra (String name, Parcelable[] value) instead.
Create Constants.java
public class Constants {
public static String BTS_EXTRA_KEY = "bts_extra";
}
Fix your Bts class to be like this
import android.os.Parcel;
import android.os.Parcelable;
public class Bts implements Parcelable {
private String nombts;
private String ipaddress;
private String logb;
private String pawb;
private int idbts;
private int xbts;
private int ybts;
public Bts(Parcel in) {
// Construct from parcel
String[] data = new String[4];
int[] dataInt = new int[3];
in.readStringArray(data);
in.readIntArray(dataInt);
nombts = data[0];
ipaddress = data[1];
logb = data[2];
pawb = data[3];
idbts = dataInt[0];
xbts = dataInt[0];
ybts = dataInt[0];
}
public Bts(int idbts, String nombts, String ipaddress, String logb, String pawb, int xbts, int ybts) {
super();
this.idbts = idbts;
this.nombts = nombts;
this.ipaddress = ipaddress;
this.logb = logb;
this.pawb = pawb;
this.xbts = xbts;
this.ybts = ybts;
}
public String getNombts() {
return nombts;
}
public void setNombts(String nombts) {
this.nombts = nombts;
}
public String getIpaddress() {
return ipaddress;
}
public void setIpaddress(String ipaddress) {
this.ipaddress = ipaddress;
}
public String getLogb() {
return logb;
}
public void setLogb(String logb) {
this.logb = logb;
}
public String getPawb() {
return pawb;
}
public void setPawb(String pawb) {
this.pawb = pawb;
}
public int getIdbts() {
return idbts;
}
public void setIdbts(int idbts) {
this.idbts = idbts;
}
public int getXbts() {
return xbts;
}
public void setXbts(int xbts) {
this.xbts = xbts;
}
public int getYbts() {
return ybts;
}
public void setYbts(int ybts) {
this.ybts = ybts;
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel parcel, int i) {
parcel.writeStringArray(new String[]{nombts, ipaddress, logb, pawb});
parcel.writeIntArray(new int[]{idbts, xbts, ybts});
}
public static final Parcelable.Creator CREATOR = new Parcelable.Creator() {
public Bts createFromParcel(Parcel in) {
return new Bts(in);
}
public Bts[] newArray(int size) {
return new Bts[size];
}
};
}
Now to pass this data to another activity, you must have the data in an ArrayList
public void onBtnClick(View v){
Intent i = new Intent(MainActivity.this, SecondActivity.class);
ArrayList<Bts> listOfBts = new ArrayList<Bts>();
listOfBts.add(new Bts(123, "323", "23423", "3423", "frlaldf", 45, 324));
listOfBts.add(new Bts(124, "323", "23423", "3423", "frlaldf", 45, 324));
listOfBts.add(new Bts(125, "323", "23423", "3423", "frlaldf", 45, 324));
listOfBts.add(new Bts(126, "323", "23423", "3423", "frlaldf", 45, 324));
listOfBts.add(new Bts(127, "323", "23423", "3423", "frlaldf", 45, 324));
listOfBts.add(new Bts(128, "323", "23423", "3423", "frlaldf", 45, 324));
i.putParcelableArrayListExtra(Constants.BTS_EXTRA_KEY, listOfBts);
startActivity(i);
}
And in the other activity
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
printBts();
}
private void printBts(){
Bundle extras = getIntent().getExtras();
ArrayList<Bts> btsList = extras.getParcelableArrayList(Constants.BTS_EXTRA_KEY);
for(Bts b : btsList){
Log.d("SecondActivity", "" + b.getIdbts());
}
}
Result:
05-10 21:14:51.414 19703-19703/si.kseneman.btstest D/SecondActivity﹕ 123
05-10 21:14:51.414 19703-19703/si.kseneman.btstest D/SecondActivity﹕ 124
05-10 21:14:51.414 19703-19703/si.kseneman.btstest D/SecondActivity﹕ 125
05-10 21:14:51.414 19703-19703/si.kseneman.btstest D/SecondActivity﹕ 126
05-10 21:14:51.414 19703-19703/si.kseneman.btstest D/SecondActivity﹕ 127
05-10 21:14:51.414 19703-19703/si.kseneman.btstest D/SecondActivity﹕ 128