2

と呼ばれる抽象的なアクティビティがありAbstractEntryActivityます。2つのアクティビティModifyEntryActivityとそれをAddEntryActivity拡張します。

Applicationで呼び出すグローバルもあり、グローバルでgetApplicationある必要がある情報を配置します。私の場合、リスト。

私の抽象的な活動では、次のような写真を撮ったり選んだりする意図を呼び出します。

public void onPickPicture(View view) {

    Intent pickIntent = new Intent();
    pickIntent.setType("image/*");
    pickIntent.setAction(Intent.ACTION_GET_CONTENT);

    Intent takePhotoIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    Intent chooserIntent = Intent.createChooser(pickIntent,
            getString(R.string.dialog_pick_picture_title));
    chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS,
            new Intent[] { takePhotoIntent });

    startActivityForResult(chooserIntent, Constants.SELECT_PICTURE);
}

onActivityResult画像を扱うメソッドもあります。ただし、呼び出される前に、メソッドonCreateが呼び出されます。(ときどき、onActivityResult が呼び出され、onCreate ではありません)

抽象アクティビティの最初のonCreate呼び出しで、アプリケーションのリストの内容を確認します。問題ありません (null でも空でもない)。さて、ギャラリーから戻ってきたときに getApplication を呼び出すと、入れた List は null です。

onCreateこれがAbstractアクティビティからの私のものです:

@Override
protected void onCreate(Bundle savedInstanceState) {
   super.onCreate(savedInstanceState);
   setContentView(R.layout.activity_add_entry);
   // Get all views ...
   ...
   mApp = (MyApplication) getApplication();
   Log.d(TAG, "mApp = "+mApp);
   Log.d(TAG, "mApp.getList() = "+mApp.getList()); // HERE it is NULL on 2nd call
   // Init date
   initDate();
   // Init all fields
   initFields() ;
   // getSupportActionBar
   ...
}

私が理解していないのは:

  • と の両方AddEntryActivityModifyEntryActivity、onCreate は同じです (super.onCreate への単純な呼び出し)。
  • で、 2ModifyEntryActivity回目の呼び出しで mApp.getList = null を取得します
  • ほとんどの場合AddEntryActivity、mApp.getList は正しい値を返すようです。待って、もう一度試してみましたが、常にそうであるとは限りません

ここで何が起こっているのか、なぜ常に同じように動作するとは限らないのか、私には本当にわかりません。何を変更したのか正確にはわかりませんが、今日までは正しく機能していました。

注意: 写真を変更しなければ問題なく、エントリは正しく追加/変更されています

何が問題なのかを教えてください。

4

1 に答える 1

0

私は何が間違っているかを見つけました。

写真を撮ったり選んだりする意図を開始したとき、実際にアプリケーションを離れました (強制終了されたと思います)。アプリケーションに戻ると、取得したアプリケーションgetApplicationはすべての値をもう一度クリアしていました。

それを修正するためonSaveInstanceStateに、リストの値をリストに入れるためにメソッドをオーバーライドするonCreate必要がありましたonRestoreInstanceState。その後、アプリケーションでリストをもう一度設定できましたgetApplication().setList(myRetrievedList)。記録のために、オーバーライド メソッドを抽象アクティビティに入れました。

保持したいデータはカスタムリストだったParcelableので、バンドルに入れるために実装する必要がありました。

それが最善の方法であるかどうかはわかりませんので、より良い解決策があれば提案してください。

于 2013-08-11T09:09:58.707 に答える