Java 如何将一个对象发送到另一个具有特殊内容的活动?

Java 如何将一个对象发送到另一个具有特殊内容的活动?,java,android,android-activity,parcelable,Java,Android,Android Activity,Parcelable,我正在为孩子们开发一个数学应用程序。用户自定义问题选项后,我想开始另一个活动。我想向活动发送一个QuestionOptions对象,以便它可以根据选项生成问题。因此,我创建了一个questionOptions类,并按照其他答案所示实现了Parcelable。但是,我的类中有一个枚举。所以我不知道该怎么做,让Android Studio生成所需的内容: package com.smartkidslovemaths; import android.os.Parcel; import android

我正在为孩子们开发一个数学应用程序。用户自定义问题选项后,我想开始另一个活动。我想向活动发送一个
QuestionOptions
对象,以便它可以根据选项生成问题。因此,我创建了一个
questionOptions
类,并按照其他答案所示实现了
Parcelable
。但是,我的类中有一个枚举。所以我不知道该怎么做,让Android Studio生成所需的内容:

package com.smartkidslovemaths;

import android.os.Parcel;
import android.os.Parcelable;

public class QuestionOptions implements Parcelable{
    protected QuestionOptions(Parcel in) {
        digitCount = in.readInt ();
    }

    public static final Creator<QuestionOptions> CREATOR = new Creator<QuestionOptions> () {
        @Override
        public QuestionOptions createFromParcel(Parcel in) {
            return new QuestionOptions (in);
        }

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

    public QuestionOptions (OperationType operationType, int digitCount, boolean timerEnabled) {
        this.operationType = operationType;
        this.digitCount = digitCount;
        this.timerEnabled = timerEnabled;
    }

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {

    }

    @Override
    public int hashCode () {
        int value;
        switch (operationType) {
            case ADDITION:
                value = 0;
                break;
            case SUBTRACTION:
                value = 4;
                break;
            case ADD_AND_SUB:
                value = 8;
            case MULTIPLICATION:
                value = 12;
                break;
            default:
                value = 0;
                break;
        }
        value += digitCount;
        if (timerEnabled)
            value += 100;
        return value;
    }

    @Override
    public boolean equals(Object o) {
        return o.hashCode() == this.hashCode();
    }

    public enum OperationType {
        ADDITION,
        SUBTRACTION,
        ADD_AND_SUB,
        MULTIPLICATION
    }

    public boolean isTimerEnabled() {
        return timerEnabled;
    }

    public void setTimerEnabled(boolean timerEnabled) {
        this.timerEnabled = timerEnabled;
    }

    public OperationType getOperationType() {
        return operationType;
    }

    public void setOperationType(OperationType operationType) {
        this.operationType = operationType;
    }

    public int getDigitCount() {
        return digitCount;
    }

    public void setDigitCount(int digitCount) {
        this.digitCount = digitCount;
    }

    private OperationType operationType;
    private int digitCount;
    private boolean timerEnabled;
}
我不知道是否正确调用了
putExtra
方法,但我继续编写代码以获取其他活动中的问题选项:

QuestionOptions options = new QuestionOptions (
                        operation, digitCount,
                        cbTimerEnabled.isChecked ());
Intent i = new Intent (MainActivity.this, QuestionsActivity.class);
i.putExtra ("com.smartkidslovemaths.option", options);
startActivity (i);
Intent i = getIntent ();
options = i.getExtras ().getParcelable ("com.smartkidslovemaths.options");
System.out.println (options.getDigitCount ());
System.out.println (options.getOperationType ());
System.out.println (options.isTimerEnabled ());
我打印出选项只是因为我想看看它是否有正确的东西。但是当我运行代码时,出现了
NullPointerException
。现在我真的不知道为什么会这样。我试着把第二行改成

options = i.getExtras ().getParcelable ("options");
但结果仍然是一样的。我想我一定是在
QuestionOptions
类中做错了什么,可能是因为我没有向packet写信,但有一个enum!没有名为
writenum()的方法。
!那么,你能告诉我我做错了什么以及如何修复它吗?如果我做错了什么,也请告诉我

编辑:

这是我的日志:

08-24 16:14:20.841      530-750/? E/Diag_Lib﹕ [IMS_FATAL]| 251 | 750 |qvp_rtp_handle_signals iRet : 0
08-24 16:14:20.841      530-750/? E/Diag_Lib﹕ [IMS_FATAL]| 238 | 750 |qvp_rtp_handle_signals qpDplMainLoop: Calling imsSignalHandler
08-24 16:14:20.841      530-750/? E/Diag_Lib﹕ [IMS_FATAL]| 155 | 750 |qpdpl:imsSignalHandler: GLobal data NULL or Event list size is 0
08-24 16:14:20.841      530-750/? E/Diag_Lib﹕ [IMS_FATAL]| 243 | 750 |qvp_rtp_handle_signals add read fd : 9
08-24 16:14:22.823      389-389/? E/Parcel﹕ Reading a NULL string not supported here.
08-24 16:14:22.823      389-389/? E/Parcel﹕ Reading a NULL string not supported here.
08-24 16:14:25.836      530-750/? E/Diag_Lib﹕ [IMS_FATAL]| 251 | 750 |qvp_rtp_handle_signals iRet : 0
08-24 16:14:25.836      530-750/? E/Diag_Lib﹕ [IMS_FATAL]| 238 | 750 |qvp_rtp_handle_signals qpDplMainLoop: Calling imsSignalHandler
08-24 16:14:25.836      530-750/? E/Diag_Lib﹕ [IMS_FATAL]| 155 | 750 |qpdpl:imsSignalHandler: GLobal data NULL or Event list size is 0
08-24 16:14:25.836      530-750/? E/Diag_Lib﹕ [IMS_FATAL]| 243 | 750 |qvp_rtp_handle_signals add read fd : 9
08-24 16:14:29.730    7104-7104/? E/AndroidRuntime﹕ FATAL EXCEPTION: main
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.smartkidslovemaths/com.smartkidslovemaths.QuestionsActivity}: java.lang.NullPointerException
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2266)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2316)
            at android.app.ActivityThread.access$600(ActivityThread.java:150)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1298)
            at android.os.Handler.dispatchMessage(Handler.java:99)
            at android.os.Looper.loop(Looper.java:213)
            at android.app.ActivityThread.main(ActivityThread.java:5225)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:525)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:741)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:557)
            at dalvik.system.NativeStart.main(Native Method)
     Caused by: java.lang.NullPointerException
            at com.smartkidslovemaths.QuestionsActivity.onCreate(QuestionsActivity.java:16)
            at android.app.Activity.performCreate(Activity.java:5133)
            at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2230)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2316)
            at android.app.ActivityThread.access$600(ActivityThread.java:150)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1298)
            at android.os.Handler.dispatchMessage(Handler.java:99)
            at android.os.Looper.loop(Looper.java:213)
            at android.app.ActivityThread.main(ActivityThread.java:5225)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:525)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:741)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:557)
            at dalvik.system.NativeStart.main(Native Method)
08-24 16:14:30.842      530-750/? E/Diag_Lib﹕ [IMS_FATAL]| 251 | 750 |qvp_rtp_handle_signals iRet : 0
08-24 16:14:30.842      530-750/? E/Diag_Lib﹕ [IMS_FATAL]| 238 | 750 |qvp_rtp_handle_signals qpDplMainLoop: Calling imsSignalHandler
08-24 16:14:30.842      530-750/? E/Diag_Lib﹕ [IMS_FATAL]| 155 | 750 |qpdpl:imsSignalHandler: GLobal data NULL or Event list size is 0
08-24 16:14:30.842      530-750/? E/Diag_Lib﹕ [IMS_FATAL]| 243 | 750 |qvp_rtp_handle_signals add read fd : 9
执行该行时发生异常:

System.out.println (options.getDigitCount ());

我试过你的代码,问题似乎出在可包裹的对象上。 请更新以下内容,它将正常工作:

接受地块对象的构造函数

protected QuestionOptions(Parcel in) {
    this.operationType = OperationType.valueOf(in.readString());
    this.digitCount = in.readInt();
    this.timerEnabled = in.readByte() != 0;
}
以及writeToParcel方法

@Override
public void writeToParcel(Parcel dest, int flags) {
    dest.writeString(this.operationType.name());
    dest.writeInt(this.digitCount);
    dest.writeByte((byte) (this.timerEnabled ? 1 : 0));
}
您可以通过以下方式从intent获取对象:

final QuestionOptions options = getIntent().getParcelableExtra("com.smartkidslovemaths.option");

我试过你的代码,问题似乎出在可包裹的对象上。 请更新以下内容,它将正常工作:

接受地块对象的构造函数

protected QuestionOptions(Parcel in) {
    this.operationType = OperationType.valueOf(in.readString());
    this.digitCount = in.readInt();
    this.timerEnabled = in.readByte() != 0;
}
以及writeToParcel方法

@Override
public void writeToParcel(Parcel dest, int flags) {
    dest.writeString(this.operationType.name());
    dest.writeInt(this.digitCount);
    dest.writeByte((byte) (this.timerEnabled ? 1 : 0));
}
您可以通过以下方式从intent获取对象:

final QuestionOptions options = getIntent().getParcelableExtra("com.smartkidslovemaths.option");

张贴日志。NPE可以直接追溯到一行代码。@ChiefTwoPencils我添加了logcat,以及异常发生的确切位置checkout答案如果您对使用第三方库感到满意,请尝试使用事件总线@Poger,但我是否以正确的方式获取了内容?发布您的logcat。NPE可以直接追踪到一行代码。@ChiefTwoPencils我添加了logcat和异常发生的确切位置checkout答案如果您对使用第三方库感到满意,请尝试事件总线@Poger,但我得到的东西正确吗?太好了!还请注意,这里的写/读顺序很重要。。。以防将来需要更新对象。太好了!还请注意,这里的写/读顺序很重要。。。以防将来需要更新对象。