0

Android 编程新手。无法在活动之间传递对象并使其可打包。有人可以告诉我可能是什么问题吗?我想知道逻辑是否合理。

public class MainActivity extends Activity {

    private Bundle MyActivityParams;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Intent intent = new Intent(this, MyActivity.class);
        MyActivityParams = fillInData(MyActivityParams);
        intent.putExtras(MyActivityParams);
        startActivity(intent, savedInstanceState);
    }
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }
    private Bundle fillInData(Bundle bundle){

        bundle.putFloat("com.company.MyActivity.FL", 12);
        bundle.putFloat("com.company.MyActivity.VH", 100);
        bundle.putFloat("com.company.MyActivity.const", 1);
        return bundle;
    }
}

public class DisplayActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        displayData();

    }
    private void displayData(){
        //ActivityData is from MyActivity
        ActivityData data = new ActivityData(getIntent().getExtras());

    }
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.activity_display, menu);
        return true;
    }
}

public class MyActivity extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        displayParams();
    }
    private void displayParams(){
        ActivityData dataBundle = new ActivityData((getIntent()).getExtras());
        transfer(dataBundle);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_algorithm, menu);
        return true;
    }

    public void transfer(ActivityData incomingdata){
        startActivity(incomingdata.getIntent());
    }

    protected static class ActivityData{
        private Bundle data;
        private TextView text;
        private Intent intent;
        public ActivityData(Bundle bundle){
            /*data = bundle;
            intent = new Intent(null, DisplayActivity.class);
            text = new TextView(null);*/
        }

        public void display(String key){
            this.text.setText(data.getString(key));
                    //not allowed: startActivity(intent);
        //not allowed either: setContentView(text);
        }

        public Intent getIntent() {
            return intent;
        }
        public void setIntent(Intent intent) {
            this.intent = intent;
        }
        public TextView getText() {
            return text;
        }
        public void setText(TextView text) {
            this.text = text;
        }
        public Bundle getData() {
            return data;
        }
        public void setData(Bundle data) {
            this.data = data;
        }
    }
}
4

3 回答 3

2

让我们有一个 Person 类

public class Person {
    private String name;
    private String email;
    private int age;

    public Person(int age, String name, String email) {
        this.age = age;
        this.name = name;
        this.email = email;
    }
}

一个可包裹的看起来像这样

public class ParcelablePerson implements Parcelable {

    private final Person person;

    private ParcelablePerson(Parcel parcel) {
        this.person = new Person(parcel.readInt(), parcel.readString(), parcel.readString());
    }

    public ParcelablePerson(Person person) {
        this.person = person;
    }

    public Person getPerson() {
        return person;
    }

    @Override
    public int describeContents() {
        return 0;
    }

    // This is the method where you disassembly your object to pieces
    @Override
    public void writeToParcel(Parcel parcel, int flags) {
        parcel.writeInt(person.getAge());
        parcel.writeString(person.getName());
        parcel.writeString(person.getEmail());
    }

    public static final Creator<ParcelablePerson> CREATOR = new Creator<ParcelablePerson>() {

        // And here you create a new instance from a parcel using the first constructor
        @Override
        public ParcelablePerson createFromParcel(Parcel parcel) {
            return new ParcelablePerson(parcel);
        }

        @Override
        public ParcelablePerson[] newArray(int size) {
            return new ParcelablePerson[size];
        }

    };
}

这个过程中的关键是在private ParcelablePerson(Parcel parcel)构造函数和public void writeToParcel(Parcel parcel, int flags)方法中具有相同的变量顺序......你可以在年龄属性上看到它,它是一个 int。

于 2012-12-09T11:38:34.220 回答
0

试试这个。

ParcelTest.java

import java.util.HashMap;

import android.os.Parcel;
import android.os.Parcelable;

public class ParcelTest implements Parcelable {
    private HashMap map;

    public ParcelTest() {
        map = new HashMap();
    }

    public ParcelTest(Parcel in) {
        map = new HashMap();
        readFromParcel(in);
    }

    public static final Parcelable.Creator CREATOR = new Parcelable.Creator() {
        public ParcelTest createFromParcel(Parcel in) {
            return new ParcelTest(in);
        }

        public ParcelTest[] newArray(int size) {
            return new ParcelTest[size];
        }
    };

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeInt(map.size());
        for (String s: map.keySet()) {
            dest.writeString(s);
            dest.writeString(map.get(s));
        }
    }

    public void readFromParcel(Parcel in) {
        int count = in.readInt();
        for (int i = 0; i < count; i++) {
            map.put(in.readString(), in.readString());
        }
    }

    public String get(String key) {
        return map.get(key);
    }

    public void put(String key, String value) {
        map.put(key, value);
    }
}

ExampleSupplierActivity.java

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;

public class ExampleSupplierActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ParcelTest p = new ParcelTest();
        p.put("green", "go");
        p.put("yellow", "wait");
        p.put("red", "stop");

        Bundle b = new Bundle();
        b.putParcelable("com.example.trafficlight", p);

        Intent i = new Intent(this, ExampleConsumerActivity.class);
        i.putExtras(b);

        startActivity(i);
    }
}

ExampleConsumerActivity.java

import android.app.Activity;
import android.os.Bundle;

public class ExampleConsumerActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Bundle b = getIntent().getExtras();

        ParcelTest p = b.getParcelable("com.example.trafficlight");

        String red = p.get("red");
        // ...
    }
}
于 2012-12-09T18:44:48.320 回答
-1

试试这个代码对我有用。但我已经实现了可序列化而不是可打包的。尝试实现 parcelable 而不是 serializable 。并尝试它是否有效。我没有尝试过,但实现了 parcelable。

传递和反对另一个活动:

in activity A
make sure the class implements the serializable interface
create a new intent
create a new bundle 
use the putSerializeable method to add the object to the bundle with a key
put the bundle in the intent by using the putExtras method
start the activity using the startActivity method


Specifically, 
        Intent intent = new Intent(ShoulderExerciseScreen.this, ExercisesScreen.class);

        Bundle bundle = new Bundle();
        bundle.putSerializable("exercise", new Exercise("BenchPress));

        intent.putExtras(bundle);

        startActivity(intent);
in activity B
declare and object of the type you want passed
use the getIntent method  to get the intent
use the getSerializeableExtra to get the the value using the key
cast the returned value from getSerializeableExtra and the desired type
    Specifically,
        Exercise ex = (Exercise)getIntent().getSerializableExtra("exercise");

        if(ex != null)
        {
            //do something
        }
于 2012-12-09T11:38:51.253 回答