2015-08-24 1 views
1

Я разрабатываю математическое приложение для детей. После того как пользователь настроит параметры вопроса, я хочу начать другое действие. Я хочу отправить объект QuestionOptions в действие, чтобы он мог генерировать вопросы в соответствии с параметрами. Поэтому я создал класс QuestionnOptions и реализовал Parcelable, как показали другие ответы. Однако в моем классе есть перечисление. Так что я не знаю, что делать, и пусть Android-студия создания вещи, необходимые:Как отправить объект в другую деятельность со специальными материалами?

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; 
} 

Теперь я посылаю QuestionOptions к другой деятельности:

QuestionOptions options = new QuestionOptions (
         operation, digitCount, 
         cbTimerEnabled.isChecked()); 
Intent i = new Intent (MainActivity.this, QuestionsActivity.class); 
i.putExtra ("com.smartkidslovemaths.option", options); 
startActivity (i); 

Я не знаю, называется ли я метод putExtra правильно, но я продолжал писать код, чтобы получить варианты вопрос в другой деятельности:

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, возможно, потому, что я не писал для посылки, но есть перечисление! Существует не метод, называемый writeEnum()! Так вы можете сказать мне, что я сделал не так, и как это исправить? И если я сделал что-то еще неправильно, скажите мне также.

EDIT:

Вот мой LogCat:

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()); 
+0

Опубликовать Ваше LogCat. NPE напрямую отслеживается с одной строкой кода. – ChiefTwoPencils

+0

@ChiefTwoPencils Я добавил logcat и точно, где произошло исключение – Sweeper

+0

Оформить заказ на [этот вопрос] (http://stackoverflow.com/questions/2836256/passing-enum-or-object-through-an-intent-the- best-solution) – Poger

ответ

0

Я попробовал ваш код, и это, кажется, проблема имеет место с детальным объектом. Пожалуйста, уточните следующее, и оно будет работать:

Конструктор, который принимает объект Parcel.

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)); 
} 

Вы можете получить объект из намерения следующим образом:

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

Спасибо, Блехи! Оно работает! – Sweeper

+0

Отлично! Также обратите внимание, что последовательность записи/чтения имеет значение здесь ... в случае, если вам нужно обновить объект в будущем. – Blehi

+0

Я вижу, еще раз спасибо! – Sweeper

Смежные вопросы