2016-03-28 18 views
2

私はの詳細アクティビティを持っています。画像のいくつかのサムネイルがリストされています。文字列としてURLを渡して新しいアクティビティを開き、ユーザーが画像のより大きなバージョンを見ることを可能にする "FullScreenActivity"にしたい。親アクティビティを失うことなく新しいアクティビティを開く

DetailsActivityには、ユーザーが全画面表示を開いたときに緩めたくない複雑なデータオブジェクトが含まれています。

は、私は新しい「FullScreenActivity」、画像のダウンロードに文字列を渡すことができ、そして私がピンチすることができますの/ etc像ズーム..しかし、私はDetailsAcitivityに戻るには、UPボタンをクリックすると、複雑なデータオブジェクトがなくなるため、アプリケーションがクラッシュします。

ユーザーが大きな画像を見ている間に、DetailsActivityをどうやって保持しますか?

ここでは、私がFullScreenActivityを呼び出す方法を示します。これはforループで呼び出され、新しい画像ビューを作成してアクティビティに追加します。

image.setOnClickListener(new View.OnClickListener() { 
@Override 
public void onClick(View v) { 
Intent intent = new Intent(DetailsActivity.this, ViewFullPhotoActivity.class); 
intent.putExtra("FullScreenPicture", (String) finalImageMap.get("MainImage")); 
startActivity(intent); 
} 
}); 

そして、私のFullScreenActivityで、私は

String fullScreenImage = (String) getIntent().getCharSequenceExtra("FullScreenPicture"); 

を経由してURL文字列を取得し、私は複雑なデータオブジェクトをパッケージ化し、新しい意図とそれを一緒に送るのアイデアをおもちゃに、しかし確実にそれはベストプラクティスではありません。その道を行くと、特にすべてのサムネイルをダウンロードしたり、フォームに入力されたデータを失ったりすると、ユーザーにとって素晴らしいものではないことがあります。

+0

アプリがクラッシュしたときにlogcatを提供できますか?それで原因を調べることができます。 – ljpv14

+0

クラッシュログは複合オブジェクトがヌルです。 –

答えて

1

onSaveInstanceState()をオーバーライドしてそこにデータを保存し、onCreate()のデータをsavedInstanceStateから取得することをお勧めします。詳細については、documentationを参照してください。あなたのデータは(ない文字列またはintまたはいくつかの単純なタイプ)複雑な場合、あなたはBundleにそれを保存するための方法を記述することができ

@Override 
public void onSaveInstanceState(Bundle savedInstanceState) { 
    super.onSaveInstanceState(savedInstanceState); 
    // Save your data here with savedInstanceState.put<something>... 
} 

savedInstanceStateバンドルに入れることができるもの)、および他の一つはバンドルを解析し、バンドルからデータを復元します)。しかし、このような画像を保存するのは良い考えではありません。あなたはそれらをsdcardにキャッシュすることができます(例えば、アプリケーションのデータディレクトリにありますが、メモリには保存しないでください)。


代わりにフルスクリーンダイアログ活動であなたの「FullScreenActivity」の内容を表示するために別のオプション、そうDetailsActivityは、バックグラウンドで破壊されることはありません。

1

onSaveInstanceStateを使用して複雑なデータ構造を保存できない場合、最も簡単な方法は、Singletonオブジェクトに保存してから、複雑なオブジェクトをメモリに保持することです。例hereがあります。

しかし、これは最善の方法ではありません。複雑なオブジェクトが常にメモリに格納されていると仮定すると、予期しないNULLポインタ例外が発生する可能性があります。あなたはさらに行きたい場合は、どちらか

  • オブジェクトをシリアル化し、SQLiteデータベースを使用して、私は後者の2つの方法を信じているDB

に保存したディスクに

  • を保存することができますより優れていますが、データ構造の複雑さに応じて重要な作業が必要になります。

  • 0

    これが行います。 マニフェストファイルの内部。

    <activity 
          android:name=".FullScreenActivity" 
          android:label="FullScreenActivity" 
          android:launchMode="singleTop" 
          android:parentActivityName=".DetailsActivity"> 
    

    これはあなたのフルスクリーンアクティビティDetailsActivityの子になります指定します。 Top of DetailsActivityでFullscreenアクティビティを開きます。

    +0

    あなたはそれを逆に持っているかもしれないと思います。私は、launchModeをDetailsアクティビティに入れ、それがうまくいった。 –

    +0

    あなたはアクティビティの子供、親コンセプトを求めました。そのため、このようなソリューションを追加しました@Firemarble – HourGlass

    0

    もっと簡単な解決策が見つかりました。私のアンドロイドマニフェストで、私の中で詳細活動私は単にandroid:launchMode="singleTop"を追加しました。それがトリックでした。

    関連する問題