1

2つのアクティビティ間で注文オブジェクトを渡そうとしています。このオブジェクトには、MenuItemsのArrayListが含まれています。Orderのクラスは次のとおりです:(パーセル可能なインターフェイスを実装します)。

public class Order extends ArrayList <MenuItem> implements Parcelable {

private int covers;
private int table;
//To hold MenuItems
private ArrayList<MenuItem> items;

public Order(){

}

public static final Parcelable.Creator<Order> CREATOR = new Parcelable.Creator<Order>() {

    @Override
    public Order createFromParcel(Parcel source) {
        return new Order(source);
    }

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


};

public Order(int covers, int table, ArrayList<MenuItem> items) {
    super();
    this.covers = covers;
    this.table = table;
    this.items = items;
}

public int getCovers() {
    return covers;
}

public void setCovers(int covers) {
    this.covers = covers;
}

public int getTable() {
    return table;
}

public void setTable(int table) {
    this.table = table;
}

public ArrayList<MenuItem> getItems() {
    return items;
}

public void setItems(ArrayList<MenuItem> items) {
    this.items = items;
}

//add menu item to order
public void addToOrder(MenuItem m){
    items.add(m);
}

//remove menu item from order
public void removeFromOrder(MenuItem m){
    items.remove(m);
}


public Order(Parcel source) {
    readFromParcel(source);

}

private void readFromParcel(Parcel source) {

    this.clear();

    //read the size of the list
    int size = source.readInt();

    //Remember order of items written into the Parcel. Important here.
    for(int i = 0; i < size; i ++){
        MenuItem item = new MenuItem();
        item.setName(source.readString());
        item.setPrice(source.readDouble());
        this.add(item);
}

}

@Override
public void writeToParcel(Parcel dest, int arg1) {
        int size = this.size();

                dest.writeInt(size);

                for(int i = 0; i < size; i ++){
                    MenuItem item = this.get(i);
                    dest.writeString(item.getName());
                    dest.writeDouble(item.getPrice());

                }

            }

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

}

アクティビティが開始したら、新しい注文アイテムを作成し、次のアクティビティに送信するインテントに配置します。ボタンをクリックして新しいアクティビティを開始すると、次のエラーが発生します。

java.lang.RuntimeException:アクティビティを開始できませんComponentInfo {com.example.waitron5 / com.example.waitron5.SectionsActivity}:java.lang.NullPointerException

以下は、オブジェクトをインテントに配置するためにMainActivity.javaで使用するコードです。

//Order object to hold details about order for duration of session
Order order;
ArrayList<Order> orderList;

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

    //As soon as app is started up create an order object.
    order = new Order();
    orderList = new ArrayList<Order>();
    orderList.add(order);

    //reference to button and add listeners
    orderBtn = (Button)findViewById(R.id.orderBtn);
    orderBtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            //Create a new intent and start up the sections activity...
            i = new Intent(v.getContext(), SectionsActivity.class);
            i.putExtra("data", (ArrayList<Order>)orderList);
            startActivity(i);
        }
    });

}

以下は、SectionsActivity.javaでインテントからオブジェクトを取得するために使用するコードです。

//Get order information
public void getOrderData(){
    i = getIntent();
    if(i != null && i.hasExtra("data")){
        Toast.makeText(this.getApplicationContext(), "recieved", Toast.LENGTH_SHORT).show();
        order = i.getParcelableExtra("data");
        int size = order.size();
        Toast.makeText(this.getApplicationContext(), String.valueOf(size), Toast.LENGTH_SHORT).show();
    }
}

なぜ私がこのエラーを受け取るのか誰かが知っていますか?パーセル可能なオブジェクトが見つからないためだとわかります。どうすれば修正できるのかわかりません。どうもありがとう。

編集:問題はこのコードのチャンク内のどこかにあると思います:

@Override
public void writeToParcel(Parcel dest, int flags) {
        int size = this.size();
                dest.writeInt(size);
                for(int i = 0; i < size; i ++){
                    MenuItem item = this.get(i);
                    dest.writeString(item.getName());
                    dest.writeDouble(item.getPrice());

                }

            }

LOGCATエラー

01-09 23:41:23.706:E / AndroidRuntime(22717):致命的な例外:メイン01-09 23:41:23.706:E / AndroidRuntime(22717):java.lang.RuntimeException:アクティビティComponentInfo{comを開始できません。 example.waitron5 / com.example.waitron5.SectionsActivity}:java.lang.NullPointerException 01-09 23:41:23.706:E / AndroidRuntime(22717):android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2180)01 -09 23:41:23.706:E / AndroidRuntime(22717):android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230)01-09 23:41:23.706:E / AndroidRuntime(22717):android.app .ActivityThread.access $ 600(ActivityThread.java:141)01-09 23:41:23.706:E / AndroidRuntime(22717):android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1234)01-09 23: 41:23.706:E / AndroidRuntime(22717):android.os.Handler.dispatchMessage(Handler.java:99)01-09 23:41:23.706:E / AndroidRuntime(22717):android.os.Looper.loop(Looper.java:137)01-09 23:41:23.706:E / AndroidRuntime(22717):at android.app.ActivityThread.main(ActivityThread.java:5039)01-09 23:41:23.706:E / AndroidRuntime(22717):at java.lang.reflect.Method.invokeNative(Native Method)01-09 23:41 :23.706:E / AndroidRuntime(22717):at java.lang.reflect.Method.invoke(Method.java:511)01-09 23:41:23.706:E / AndroidRuntime(22717):atcom.android.internal。 os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:793)01-09 23:41:23.706:E / AndroidRuntime(22717):com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)01 -09 23:41:23.706:E / AndroidRuntime(22717):dalvik.system.NativeStart.main(ネイティブメソッド)01-09 23:41:23.706:E / AndroidRuntime(22717):原因:java.lang。 NullPointerException 01-09 23:41:23.706:E / AndroidRuntime(22717):com.example.waitron5.SectionsActivity.getOrderData(SectionsActivity.java:113)01-09 23:41:23.706:E / AndroidRuntime(22717):com.example.waitron5.SectionsActivity.onCreate (SectionsActivity.java:44)01-09 23:41:23.706:E / AndroidRuntime(22717):android.app.Activity.performCreate(Activity.java:5104)01-09 23:41:23.706:E / AndroidRuntime (22717):android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080)01-09 23:41:23.706:E / AndroidRuntime(22717):android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144) 01-09 23:41:23.706:E / AndroidRuntime(22717):...11詳細onCreate(SectionsActivity.java:44)01-09 23:41:23.706:E / AndroidRuntime(22717):android.app.Activity.performCreate(Activity.java:5104)01-09 23:41:23.706:E / AndroidRuntime(22717):android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080)01-09 23:41:23.706:E / AndroidRuntime(22717):android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144) )01-09 23:41:23.706:E / AndroidRuntime(22717):... 11 moreonCreate(SectionsActivity.java:44)01-09 23:41:23.706:E / AndroidRuntime(22717):android.app.Activity.performCreate(Activity.java:5104)01-09 23:41:23.706:E / AndroidRuntime(22717):android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080)01-09 23:41:23.706:E / AndroidRuntime(22717):android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144) )01-09 23:41:23.706:E / AndroidRuntime(22717):... 11 moreE / AndroidRuntime(22717):...11詳細E / AndroidRuntime(22717):...11詳細

LOGCAT警告

* 01-09 23:41:23.676:W / Bundle(22717):キーデータはParcelableを期待していましたが、値はjava.util.ArrayListでした。デフォルト値が返されました。 01-09 23:41:23.686:W / Bundle(22717):生成された内部例外をキャストしようとしました:01-09 23:41:23.686:W / Bundle(22717):java.lang.ClassCastException:java.util.ArrayList android.os.Parcelable 01-09 23:41:23.686にキャストできません:W / Bundle(22717):android.os.Bundle.getParcelable(Bundle.java:1171)01-09 23:41:23.686:W / Bundle(22717):android.content.Intent.getParcelableExtra(Intent.java:4330)01-09 23:41:23.686:W / Bundle(22717):com.example.waitron5.SectionsActivity.getOrderData(SectionsActivity。 java:112)01-09 23:41:23.686:W / Bundle(22717):com.example.waitron5.SectionsActivity.onCreate(SectionsActivity.java:44)*

4

3 に答える 3

3

私はなんとか問題を解決することができました。問題は、OrderクラスがParcelableを適切に実装していたことでした。ただし、MenuItemのリストが含まれているため、Parcelableインターフェイスを実装するためにMenuItemクラスも必要でした。

これを実行すると、問題は修正されました。

于 2013-01-10T01:36:14.310 に答える
2

LogCatスタックトレース全体を見て、エラーが発生した場所を正確に知ることは非常に役立ちますが、1つの潜在的な問題をすぐに確認できます。

デフォルトのコンストラクターはスーパーコンストラクターを呼び出しません。

public Order(){

}

したがって、writeToParcel()が呼び出されると、おそらくnullリストであるものから値をフェッチしようとします。

MenuItem item = this.get(i); // You never initialized the super class...
于 2013-01-09T23:17:06.653 に答える
0

変化するi = getIntent();

i = getIntent().getCharSequenceArrayListExtra("data");

ArrayListを取得するために更新します

于 2013-01-09T23:17:54.260 に答える