助けてください、私は onSaveInstanceState のものと onConfigChange のものを掘り下げましたが、画像を取得できません。
Google Play 経由で公開したアプリで例外が報告されましたが、私の開発環境では再現できません。追跡した後、PreviewActivity の onCreate メソッドで 2 つの NullPointerException が発生したことがわかりました。
問題 1:
(a)。PreviewActivity の onCreate メソッドのコード:
public void onCreate(Bundle savedInstanceState) {
setContentView(R.layout.logo_preview_layout);
...
mBtnCheckGuess = (Button)findViewById(R.id.btn_check_guess);
mVgGuessPanel = (View)findViewById(R.id.layout_guess); // the exception line!
...
}
(b)。レイアウト xml のコード (一部のみ)
<ScrollView
android:gravity="center_horizontal"
android:orientation="vertical"
android:id="@+id/main_layout"
android:layout_width="fill_parent" android:layout_height="fill_parent"
android:layout_marginTop="25.0dip" android:layout_marginBottom="10.0dip">
<LinearLayout
android:orientation="vertical"
android:layout_width="fill_parent" android:layout_height="wrap_content">
<RelativeLayout
android:id="@+id/layout_guess"
android:layout_gravity="center_horizontal"
android:layout_width="fill_parent" android:layout_height="wrap_content"
android:layout_marginTop="0.0dip" android:layout_marginBottom="0.0dip"
android:visibility="visible">
このレイアウト xml ファイルには、他の @id/layout_guess はないと確信しています。
(c). AndroidManifest.xml のコード
<activity
android:name=".PreviewActivity"
android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize"
android:screenOrientation="portrait">
</activity>
この問題で数十の NullPointerException が発生しましたが、AndroidManifest で次の行を削除した後:
android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize"
この 2 日間、新しいリリース バージョンのアプリで同じ問題は発生していません。理由は全くわかりません...
問題 2: 背景、A が B を開始するときにアクティビティ A からアクティビティ B にオブジェクトを渡したいので、Android の Application オブジェクトを使用して、このオブジェクトをインスタンス変数に含めました。
(a) MyApplication のコード:
public class MyApplication extends Application{
Logo mSelectedLogo;
@Override
public void onCreate(){
}
public void setSelectedLogo(Logo logo){
mSelectedLogo = logo;
}
public Logo getSelectedLogo(){
return this.mSelectedLogo;
}
}
(b) アクティビティ A の部品コード
mApplication.setSelectedLogo(logo);
Intent intent = new Intent(this, ActivityB.class);
LogoListActivity.this.startActivityForResult(intent, REQUEST_GUESS);
(c) アクティビティ B のコード
public void onCreate(Bundle savedInstanceState) {
...
MyApplication mApplication = (MyApplication)this.getApplication();
mSelectedLogo = mApplication.getSelectedLogo();
ALog.d(TAG, "correct logo name: " + mSelectedLogo.mName + ", id: " + mSelectedLogo.mId); // NullPointerException line, obviously mApplication.getSelectedLogo() returns NULL
...
}
なぜNULLになるのかは本当に奇妙です。MyApplication オブジェクトが破棄されていない限り。
エラーログはこちら:
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.codefes.quiz/com.codefes.quiz.PreviewActivity}: java.lang.NullPointerException
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1651)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1667)
at android.app.ActivityThread.access$1500(ActivityThread.java:117)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:935)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:123)
at android.app.ActivityThread.main(ActivityThread.java:3687)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:507)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:625)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.NullPointerException
at com.codefes.quiz.PreviewActivity.onCreate(Unknown Source)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1615)
... 11 more
助けてください、ありがとう!