我是Java新手,甚至是Android新手。我目前正在尝试使用另一个活动中的一个活动来访问对象。在StackOverflow和Google上搜索后,我决定使用Parcelable
类。
在我的代码中,对象的类是Protag
,引用该对象的变量的名称是hero
。我编写了Parcelable方法,虽然我不确定它们与从对象访问数据的关系。
一项活动有:
myIntent.putExtra("heroData", hero);
myIntent有这样的东西:
heroP = (Protag) getIntent().getParcelableExtra("heroData");
但是,当myIntent尝试访问heroP.arbritraryInt
时,它会返回0
,而我无法从教程中了解我应该如何访问它。
如何在此上下文中使用Parceable
类?
答案 0 :(得分:1)
Parcelable确实是你需要的。它比Serializable更优化,但也需要大量代码
在这方面,我建议你看看这个方便的plugin。它将为您完成所有艰苦的工作,并在您的情况下避免在构建您的Parcelable时出错。
但是当你使用它的时候,你应该启动并运行你的对象,并且可以根据需要从你的Bundle访问你的属性。
祝你好运
答案 1 :(得分:1)
处理parceling的另一个好方法是Parceler库。
https://github.com/johncarl81/parceler
它会使你的apk更大,插件ptitvinou提到的不会,但优点是代码仍然非常简单易读,而不是正常的Android分区。
答案 2 :(得分:0)
我会使用http://www.parcelabler.com/来生成parcel代码而不是parceler这样的库,它们使用注释处理器并在每次构建时启动。
这只是个人偏好,Parceler非常好用且很有用。这也取决于你的项目。如果parcelables经常变化,Parceler应该是一个不错的选择。但是,如果只是一次,我认为用上述链接生成一次是一个不错的选择。
例如,您的班级就像:
package com.example.hero;
import java.util.ArrayList;
public class Hero {
String heroName;
int primaryWeapon;
ArrayList<Integer> allWeapons;
boolean canFly;
}
使用上面发布的链接进行转换,它会生成如下内容:
package com.example.hero;
import java.util.ArrayList;
public class Hero implements Parcelable {
String heroName;
int primaryWeapon;
ArrayList<Integer> allWeapons;
boolean canFly;
protected Hero(Parcel in) {
heroName = in.readString();
primaryWeapon = in.readInt();
if (in.readByte() == 0x01) {
allWeapons = new ArrayList<Integer>();
in.readList(allWeapons, Integer.class.getClassLoader());
} else {
allWeapons = null;
}
canFly = in.readByte() != 0x00;
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(heroName);
dest.writeInt(primaryWeapon);
if (allWeapons == null) {
dest.writeByte((byte) (0x00));
} else {
dest.writeByte((byte) (0x01));
dest.writeList(allWeapons);
}
dest.writeByte((byte) (canFly ? 0x01 : 0x00));
}
@SuppressWarnings("unused")
public static final Parcelable.Creator<Hero> CREATOR = new Parcelable.Creator<Hero>() {
@Override
public Hero createFromParcel(Parcel in) {
return new Hero(in);
}
@Override
public Hero[] newArray(int size) {
return new Hero[size];
}
};
}
自己编写代码并不困难,但一旦你不得不一遍又一遍地做同样的事情就会变得单调乏味。
如果您在类中使用非原始字段,请确保它们实现Parcelable或Serializable
按照以下链接了解有关如何使用Parcelable的更多信息: https://guides.codepath.com/android/Using-Parcelable
希望有所帮助!
答案 3 :(得分:0)
Singleton Class方法
public class SingletonClass {
//Final Instance
private static final SingletonClass SINGLETON_CLASS = new SingletonClass();
private MyObj myObj;
/**
* Protected Constructor for Thread Safing
*/
protected SingletonClass(){
}
public static SingletonClass getInstance(){
return SINGLETON_CLASS;
}
public MyObj getMyObj() {
return myObj;
}
public void setMyObj(MyObj myObj) {
this.myObj = myObj;
}
}
然后你就像这样存储你的对象:
SingletonClass.getInstance().setMyObj(myObj);
你找回它:
MyObj myObj = SingletonClass.getInstance().getMyObj;