-1

Weekly ResultParcel インターフェイスを実装するというクラスがあります。パーセル オブジェクトを別のアクティビティに渡すときに、そのオブジェクトを取得する際に問題が発生しています。

これは私のweeklyResultクラスです:

public class WeeklyTopicResult implements Parcelable {

public String ID;
public MultiLingual Title = new MultiLingual();
public MultiLingual Text = new MultiLingual();
public String ImageUrl;
public String PublishOn;
public Bitmap ImageSource;

public WeeklyTopicResult(Parcel in) {
    // Reads the obj value
    ReadFromParcel(in);

}

public WeeklyTopicResult() {
    // TODO Auto-generated constructor stub
}

@Override
public int describeContents() {
    // TODO Auto-generated method stub
    return 0;
}

@Override
public void writeToParcel(Parcel dest, int flags) {
    // TODO Auto-generated method stub
    Log.v("WeekData", "WriteToParcel..." + flags);
    dest.writeString(ID);
    dest.writeString(ImageUrl);
    dest.writeString(PublishOn);
    dest.writeParcelable(Title, flags);
    dest.writeParcelable(Text, flags);
    dest.writeParcelable(ImageSource, flags);

}

public void ReadFromParcel(Parcel obj) {
    Log.v("WeeklyClaas",
            "ParcelData(Parcel source): time to put back parcel data");
    ID = obj.readString();
    Title = (MultiLingual) obj.readParcelable(MultiLingual.class
            .getClassLoader());
    Text = (MultiLingual) obj.readParcelable(MultiLingual.class
            .getClassLoader());
    ImageUrl = obj.readString();
    PublishOn = obj.readString();
    ImageSource = (Bitmap) obj
            .readParcelable(Bitmap.class.getClassLoader());

}

public class WeeklyTopicResultParcelCreater implements
        Parcelable.Creator<WeeklyTopicResult> {

    @Override
    public WeeklyTopicResult createFromParcel(Parcel source) {
        // TODO Auto-generated method stub
        return new WeeklyTopicResult(source);
    }

    @Override
    public WeeklyTopicResult[] newArray(int size) {
        // TODO Auto-generated method stub
        return new WeeklyTopicResult[size];
    }
}
}

これは私のMultilinqualクラスです:

public class MultiLingual implements Parcelable {

public String ArbicValue;

public String EnglishValue;

public MultiLingual(Parcel in) {
    ReadFromParcel(in);
}

public MultiLingual() {
    // TODO Auto-generated constructor stub
}

@Override
public int describeContents() {
    // TODO Auto-generated method stub
    return 0;
}

@Override
public void writeToParcel(Parcel dest, int flags) {
    // TODO Auto-generated method stub
    dest.writeString(ArbicValue);
    dest.writeString(EnglishValue);

}

private void ReadFromParcel(Parcel Obj) {

    ArbicValue = Obj.readString();
    EnglishValue = Obj.readString();
}

public class MyMultiLingualParcelCreator implements
        Parcelable.Creator<MultiLingual> {

    @Override
    public MultiLingual createFromParcel(Parcel source) {
        // TODO Auto-generated method stub
        return new MultiLingual(source);
    }

    @Override
    public MultiLingual[] newArray(int size) {
        // TODO Auto-generated method stub
        return new MultiLingual[size];
    }

}
}

そして、ここに私が目的のオブジェクトを送信している場所があります:

public void GoToWeeklyTopic(View v) {
    Intent intent = new Intent();
    intent.setClass(HomeActivity.this, Topic_of_the_week.class);

    Bundle b = new Bundle();
    WeeklyTopicResult w = weeks;

    // Puts the weeklyresult parcel class into bundle
    b.putParcelable("WeeklyContent", w);

    intent.putExtras(b);
    startActivity(intent);
}

パーセル オブジェクトを受信しようとしているアクティビティ クラスは次のとおりです。

ImageView weekImg;
TextView title;
TextView ContentText;
WeeklyTopicResult week= new WeeklyTopicResult();

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_topic_of_the_week);

    Bundle extras = getIntent().getExtras();
            //Here I am receiving an error
    week =extras.getParcelable("WeeklyContent");


    weekImg = (ImageView) findViewById(R.id.imageView1);
    title = (TextView) findViewById(R.id.txt_MainTitle);
    ContentText = (TextView) findViewById(R.id.txt_page_content_topicweek);

    title.setText(week.Title.EnglishValue);
    ContentText.setText(week.Text.EnglishValue);
    weekImg.setImageBitmap(week.ImageSource);
    // String FullPath = RetrieveData_Preference("WeeklyTopicUrl") + Url;
    // getImage(FullPath);

}

オブジェクトをキャストバックしようとしましたが、それでもエラーが発生します。Logcat エラーでこのエラーが表示されましたが、weeklyresult のクリエーター クラスを既に実装しています。

LogCat エラー:

致命的な例外: main
java.lang.RuntimeException: Unable to start activity

ComponentInfo{com.example.laysapp/com.example.laysapp.AdminPage.Topic_of_the_week}:
android.os.BadParcelableException: Parcelable プロトコルには、クラス com.example.laysapp.ParsingLogic.WeeklyTopicResult
E/AndroidRuntime( 1231):
android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2180)
で android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230)
で android.app.ActivityThread.access$600(ActivityThread.java:141)
でandroid.app.ActivityThread$H.handleMessage(ActivityThread.java:1234)
で android.os.Handler.dispatchMessage(Handler.java:99)
android.os.Looper.loop(Looper.java:137) で android.app.ActivityThread.main(ActivityThread.java:5039) で java.lang.reflect.Method.invokeNative(Native Method) で java.lang.reflect で.Method.invoke(Method.java:511) で com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) で com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) ) dalvik.system.NativeStart.main(Native Method) で 原因: android.os.BadParcelableException: Parcelable プロトコルには、android.os.Parcel のクラス com.example.laysapp.ParsingLogic.WeeklyTopicResult で CREATOR と呼ばれる Parcelable.Creator オブジェクトが必要です。 readParcelable(Parcel.java:2086) で android.os.Parcel.readValue(Parcel.java:1965) で android.os.Parcel.readMapInternal(Parcel.java:2226) で android.os.Bundle.unparcel(Bundle.java:223) で android.os.Bundle.getParcelable(Bundle.java:1165) で com.example.laysapp.AdminPage.Topic_of_the_week.onCreate( Topic_of_the_week.java:40 ) android.app.Activity.performCreate(Activity.java:5104) で android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080) で android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144) ... 11もっとcallActivityOnCreate(Instrumentation.java:1080) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144) ... 11 詳細callActivityOnCreate(Instrumentation.java:1080) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144) ... 11 詳細

ここで何が間違っていますか?

4

2 に答える 2

4

ドキュメントから:

Parcelableインターフェースを実装するクラスには、Parcelable.Creatorインターフェースを実装するオブジェクトであるCREATORと呼ばれる静的フィールドも必要です。

したがって、このフィールドをMultiLingualクラスに追加します。

public static final MyMultiLingualParcelCreator CREATOR = new MyMultiLingualParcelCreator();
于 2012-12-26T18:24:31.467 に答える
0

あなたはいつもあなたが書くのと同じ順序で読む必要があります:

@Override
public void writeToParcel(Parcel dest, int flags) {
    // TODO Auto-generated method stub
    Log.v("WeekData", "WriteToParcel..." + flags);
    dest.writeString(ID);
    dest.writeString(ImageUrl);
    dest.writeString(PublishOn);
    dest.writeParcelable(Title, flags);
    dest.writeParcelable(Text, flags);
    dest.writeParcelable(ImageSource, flags);

}

public void ReadFromParcel(Parcel obj) {
    Log.v("WeeklyClaas",
            "ParcelData(Parcel source): time to put back parcel data");
    ID = obj.readString();
    //these were lower
    ImageUrl = obj.readString();
    PublishOn = obj.readString();
    Title = (MultiLingual) obj.readParcelable(MultiLingual.class
            .getClassLoader());
    Text = (MultiLingual) obj.readParcelable(MultiLingual.class
            .getClassLoader());
    ImageSource = (Bitmap) obj
            .readParcelable(Bitmap.class.getClassLoader());
}
于 2012-12-26T18:25:17.007 に答える