2013-05-10 63 views
1

我知道这已经被问过太多次了,但答案似乎并不适用。用getExtras()返回null

活性1:

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

活动2:

@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” 是parcelable因为我有它正确地返回别处。 this.getIntent()。getExtras()。getParcelable(“USER_DETAILS”)简单地返回null。 我继续遇到这个问题,我该如何修复它,或者我根本没有得到什么?

+1

您能打印异常吗?在logcat中粘贴logcat :) – 2013-05-10 03:25:09

+0

当访问UD的方法时它是一个'nullPointException',但问题应该立即解决!谢谢! – 2013-05-10 03:47:19

+0

如果您的问题已解决,请将解决方案作为答案添加并接受。 – Mudassir 2013-05-10 05:03:36

回答

0

您可以通过制作的UserDetails实现Serializable做这样的事情:

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

,然后检索这样的对象:

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

编辑: 在性能上重要的序列化慢于Parcelable,Check这个出来。无论如何,我发布这个解决方案,以解决您的问题。

+0

反正我不需要'实现'可序列化。我也听说它比较慢。如果我错了,请让我陷入困境! – 2013-05-10 03:45:20

1

尝试

UserDetails UD = (UserDetails) getIntent().getParcelableExtra("USER_DETAILS"); 
+0

好吧,我想出了我的问题,(我也有一个名为UD的领域)< - 白痴,但我想知道是否有太多的额外获取方法之间的区别? – 2013-05-10 03:43:13

+1

根据Android Intent文档,getExtra()会返回您使用putExtra()添加的所有附加功能的地图。为了明确地获取您的parcelable对象,您必须使用getParcelableExtra()。 – ps2010 2013-05-11 03:06:52

0

也许this可以帮助您与Parcelable

如果您是通过intent发送non-primitive type data/Object到另一个活动,你必须要么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?你不会看到,所以谁在乎?而且,为什么有人会在编写手动序列化时投入大量精力,以免在性能上产生任何可察觉的差异?

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

} 

我送(写)对象Parcelable “DealCategory” 从活动A到活动B

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

我接受(读取)对象Parcelable “DealCategory”来自活动A的活动B

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

我检查是否收到更正的值。我temporaly显示他们在日志

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 
0
UserDetails UD 

被宣布为既是一个字段和局部变量,我没有注意到,

我想这个问题的一个很好的副产品是...

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

...工作方式不同,需要保持一致的方法。