如何使用意向额外通过序列化对象的数组?(How to use Intent Extras to pa

2019-10-23 01:42发布

我想通过对象的数组,而无需使用我使用意向的喜好!

Object类箱瓶

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
}

源活动PS:JSONParseBts充满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> { ... }

}

而distination活动:

    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();                        


              }});

            }
        }

    }

错误是:

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[]

Answer 1:

您可以使用包含序列化数组的包装类,我只是测试这和它的作品。

首先,创建简单的包装类:

import java.io.Serializable;

public class BtsWrapper implements Serializable{
    Bts[] array;
    public BtsWrapper(Bts[] a){
        array = a;
    }
}

然后,通过在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);
        }
    });

然后,您可以通过额外的序列化的包装,只是提取数组:

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");
}


Answer 2:

我相信有一个允许一些序列化对象的数组没有这样putExtra API存在。 见http://developer.android.com/reference/android/content/Intent.html#putCharSequenceArrayListExtra(java.lang.String ,java.util.ArrayList中)起。 也没有可用于提取意图一些序列化对象的数组吸气。

也许你可以让你的箱瓶类Parcelable和使用公共意向putExtra(字符串名称,Parcelable [] value)取而代之。



Answer 3:

创建Constants.java

public class Constants {
    public static String BTS_EXTRA_KEY = "bts_extra";
}

修复您箱瓶类是这样的

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];
        }
    };
}

现在,这个数据传递到另一个活动,你必须有一个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);
}

而在其他活动

@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());
    }
}

结果:

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


文章来源: How to use Intent Extras to pass Array of Serializable objects?