我正在嘗試實施Parcleable,以便我可以將其添加爲額外的(這是一項要求)。啓動活動後沒有出現可修復的問題
這裏是類SwinImage
這隻能說明相關的細節,即它是從Parcleable衍生部分的削減版本:
package com.example.kevin.imagemetadata;
import android.os.Parcel;
import android.os.Parcelable;
public class SwinImage implements Parcelable
{
public SwinImage(String imageName, String location, String[] keywords, String imageDate, boolean share, String email, int rating)
{
update(imageName, location, keywords, imageDate, share, email, rating);
}
//A constructor for when we havent assigned any metadata.
public SwinImage(String imageName)
{
}
public void update(String imageName, String location, String[] keywords, String imageDate, boolean share, String email, int rating)
{
}
@Override
public String toString()
{
}
private void storeImageDetails() {
}
@Override
//We don't need it - but we are forced to due to interface.
public int describeContents()
{
return 0;
}
@Override
public void writeToParcel(Parcel out, int flags)
{
out.writeString(imageName);
out.writeString(location);
out.writeStringArray(keywords);
out.writeString(imageDate);
//Can write boolean array but not boolean...
boolean[] temp = {share};
out.writeBooleanArray(temp);
out.writeString(email);
out.writeInt(rating);
}
public static final Parcelable.Creator<SwinImage> CREATOR = new Parcelable.Creator<SwinImage>()
{
@Override
public SwinImage createFromParcel(Parcel parcel)
{
return new SwinImage(parcel);
}
@Override
public SwinImage[] newArray(int i)
{
return new SwinImage[i];
}
};
//THE PRIVATE CONSTRUCTOR - FOR INTERNAL USE ONLY.
private SwinImage(Parcel parcel)
{
imageName = parcel.readString();
location = parcel.readString();
parcel.readStringArray(keywords);
imageDate = parcel.readString();
boolean[] tempArr = new boolean[1];
parcel.readBooleanArray(tempArr);
share = tempArr[0];
email = parcel.readString();
rating = parcel.readInt();
}
}
好......所以,在調用的類,我這樣做:
public void ClickedImage(View v)
{
Intent i = new Intent(this, MetaDataActivity.class);
switch (getResources().getResourceEntryName(v.getId()))
{
case "burgerView":
i.putExtra("SENT_IMAGE", burger); //IT IMPLEMENTS PARCLEABLE THEREFORE WE CAN PASS IT WHERE IT LOOKS FOR A PARCEL
break;
case "pitaView":
i.putExtra("SENT_IMAGE", pita);
break;
case "pizzaView":
i.putExtra("SENT_IMAGE", pizza);
break;
case "steakView":
i.putExtra("SENT_IMAGE", steak);
break;
}
startActivityForResult(i, GET_AND_SET_METADATA_REQUEST);
}
我在最後設置斷點,並且確實可以看到,這是在正確的意圖:
然而,當談到獲得它:
@Override
protected void onCreate(Bundle savedInstanceState)
{
Log.d("Does", "Does this work");
Intent i;
i = getIntent();
image = i.getExtras().getParcelable("SENT_IMAGE");
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_meta_data);
}
這是從來沒有在那裏。 image
的分配會使程序崩潰,而且我無法看到調試器我的SwinImage
甚至存在於意圖內。
我在做什麼錯?它爲什麼會崩潰?我已經嘗試了幾個小時的解決方案(主要是改變我的分配方式 - 有些「解決方案」已經阻止了它的崩潰,但image
被分配了空值)
任何人都可以提供一些見解嗎?謝謝。
編輯:
我試圖移動getIntent
到onCreate
後無果。
編輯#2:堆棧跟蹤:
http://pastebin.com/raw/XJbPxHRv
和類型的steak
等:
public class MainActivity extends AppCompatActivity {
static final int GET_AND_SET_METADATA_REQUEST = 1; // The request code
SwinImage burger, pita, pizza, steak;
如果你有崩潰,爲什麼不從設備的logcat附加崩潰日誌?同時顯示代碼使用的變量類型('image','pizza'等)。 – Sergio
嗨,謝謝@Serhio我已經更新了OP。 – Kevin