使用getExtras()返回null

时间:2013-05-10 03:16:58

标签: android android-intent

我知道这已被问了很多次,但答案似乎永远不适用。

活动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”是可以分配的,因为我在其他地方正确地返回。  this.getIntent()。getExtras()。getParcelable(“USER_DETAILS”)只返回null。 我继续遇到这个问题,如何修复它或者我根本没有得到什么?

5 个答案:

答案 0 :(得分:1)

尝试

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

答案 1 :(得分: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慢Check。无论如何,我发布了这个解决方案来解决你的问题。

答案 2 :(得分:0)

也许this可以帮助您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?你也不会看到,所以谁在乎呢?而且,为什么有人会在编写手动序列化时投入大量精力来实现性能上没有任何明显差异?

答案 3 :(得分: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()
}

我从活动A <活动B中接收(读取)对象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

答案 4 :(得分:0)

UserDetails UD

被声明为字段和局部变量,我没有注意到,

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

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

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