1

我知道这个问题已经被问过很多次了,但答案似乎从来都不适用。

活动一:

public void buttonPress(View view){
    Intent i = new Intent(this,ProfilePage.class);  
    i.putExtra("USER_DETAILS", UD);
    startActivity(i);
}

活动二:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_profile_page);
    try{
        UserDetails UD = (UserDetails)this.getIntent().getExtras().getParcelable("USER_DETAILS");
        ((TextView)findViewById(R.id.First)).setText(UD.getFirst_name());
        ((TextView)findViewById(R.id.Last)).setText(UD.getLast_name());
    }catch (Exception e) {
        Log.e("GETTING EXTRAS", e.toString());
    }
}

“UD”是可包裹的,因为我让它在其他地方正确返回。this.getIntent().getExtras().getParcelable("USER_DETAILS") 只是返回 null。我继续遇到这个问题,我该如何解决它或者我根本没有得到什么?

4

5 回答 5

1

尝试

UserDetails UD = (UserDetails) getIntent().getParcelableExtra("USER_DETAILS");
于 2013-05-10T03:29:40.050 回答
0
UserDetails UD

was declared as both a field and a local variable and I didn't notice,

I guess a good byproduct of this question is...

getIntent().getParcelableExtra("USER_DETAILS");
getIntent().getExtras().getParcelable("USER_DETAILS");

...work differently and one needs to stay consistent in approach.

于 2013-05-11T08:31:01.233 回答
0

我刚刚开发了我的第一个 Parcelable 类,它实现了 Parcelable 接口。我真的很高兴,因为它工作正常。也许我的解决方案可以帮助任何人:

public class DealCategory implements Parcelable {

private int categoryID;
private String categoryName;
private List<DealCategory> listaCategoriasSeleccionadas = new ArrayList<DealCategory>();

/**
 * GET/SET 
 */



//-----------------------------------------------------------|
//-----------------------------------------------------------|
//------------------- METHODS FOR PARCELABLE ----------------|
//-----------------------------------------------------------|
//-----------------------------------------------------------|

/*
 * (non-Javadoc)
 * @see android.os.Parcelable#describeContents()
 * Implementacion de los metodos de la Interfaz Parcelable
 */
@Override
public int describeContents() {
    return hashCode();
}

/*
 * (non-Javadoc)
 * @see android.os.Parcelable#writeToParcel(android.os.Parcel, int)
 * IMPORTANT
 *  We have to use the same order both TO WRITE and TO READ 
 */
@Override
public void writeToParcel(Parcel dest, int flags) {
    dest.writeInt(categoryID);
    dest.writeString(categoryName);
    dest.writeTypedList(listaCategoriasSeleccionadas);  
}


/*
 * (non-Javadoc)
 * @see android.os.Parcelable#writeToParcel(android.os.Parcel, int)
 * IMPORTANT
 *  We have to use the same order both TO WRITE and TO READ
 *  
 * We reconstruct the object reading from the Parcel data
 */ 
public DealCategory(Parcel p) {  
    categoryID = p.readInt();    
    categoryName = p.readString();   
    p.readTypedList(listaCategoriasSeleccionadas, DealCategory.CREATOR);     
}


/*
 * (non-Javadoc)
 * @see android.os.Parcelable#writeToParcel(android.os.Parcel, int)
 * We need to add a Creator
 */ 
public static final Parcelable.Creator<DealCategory> CREATOR = new Parcelable.Creator<DealCategory>() {

    @Override    
    public DealCategory createFromParcel(Parcel parcel) { 
        return new DealCategory(parcel);
    }

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

}

我将 Object Parcelable“DealCategory”从活动 A 发送(写入)到活动 B

protected void returnParams(DealCategory dc) {
      Intent intent = new Intent();
      intent.putExtra("Category", dc);
      setResult(REQUEST_CODE_LISTA_DEALS, intent);
      finish()
}

我从活动 A 接收(读取)活动 B 中的 Object Parcelable“DealCategory”

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    Bundle b = data.getExtras();             
    DealCategory dc = (DealCategory) b.getParcelable("Category");

我检查我是否收到更正的值。我暂时在日志中显示它们

for (int i = 0; i < dc.getListaCategorias().size(); i++) {
            Log.d("Selected Category", "ID: " +  dc.getListaCategorias().get(i).getCategoryID() + " -- NAME:" + dc.getListaCategorias().get(i).getCategoryName());
            lR += dc.getListaCategorias().get(i).getCategoryName() +", ";
        }

} //Close onActivityResult
于 2013-05-10T06:42:22.807 回答
0

你可以通过让 UserDetails 实现 Serializable 来做这样的事情:

Intent i = new Intent(this,ProfilePage.class);  
i.putExtra("USER_DETAILS", UD);

然后像这样检索对象:

UserDetails UD = (UserDetails)this.getIntent().getSerializableExtra("USER_DETAILS");

编辑: 在性能问题上,Serializable 比 Parcelable 慢,检查一下。无论如何,我将其发布为解决您的问题的方法。

于 2013-05-10T03:26:51.637 回答
0

也许可以帮助你Parcelable

如果您通过 发送non-primitive type data/Object到另一个活动,则intent必须为该对象Serialize执行或实现。Parcelable首选技术是Parcelable因为它不会影响性能。

很多人会告诉你这Serialization是非常缓慢和低效的,这是正确的。但是,作为一名计算机程序员,你永远不想做的一件事是将任何关于性能的评论视为绝对的。

问问自己是否serialization正在减慢您的程序。您是否注意到它从一个活动到另一个活动?您是否注意到它何时保存/加载?如果没有,那很好。当您使用大量手动序列化代码时,您不会获得更小的足迹,因此没有任何优势。所以what if it is 100 times slower than an alternative if 100 times slower means 10ms instead of 0.1ms?你也不会看到,所以谁在乎呢?而且,当手动序列化不会对性能产生任何明显影响时,为什么会有人投入大量精力来编写手动序列化?

于 2013-05-10T04:18:24.783 回答