1

私のアプリでは、1つのアクティビティと9つのフラグメントがあり、ユーザーがフラグメント1からフラグメント2に移動するときに常に置き換えられて保持されます。フラグメント1のメソッドonDestroyViewが呼び出され、すべてのフィールド内部にいくつかのカスタムオブジェクトを持つ大きなリンクリストを持っている)と、それらをメモリに保持すると、OutOfMemory例外がスローされるような他のオブジェクトがあります。Android Fragments - 状態を保存する場所(カスタムオブジェクトのリンクリスト)

このリストはどこに保存しますか?データベースに? (ここで私はあなたがそれを可能にするためにいくつかのハッキングを行う必要があることを見た)。 最初はonSaveInstanceStateメソッドで提供されたバンドルにそれらを格納することを考えましたが、そのメソッドは、すべてのフラグメントの "コンテナ"コンテナとして機能するActivityにタイトなので、決して呼び出されません。

そして私はOnSaveInstanceStateに関して、フラグメント内での良い練習ではないと思っています。だから、私はすべてのフィールドをクリーンアップし、私はそれらをいくつかの場所に保存する必要があります、そして、フラグメントが再作成されたら、すべての変数を取り戻して、ユーザーがそれを残したままにしてください。 (リサイクラビューの中でのポジションを維持するなど)

私はこれに関する多くのことを検索し、これに関する具体的な回答は見つかりませんでした。

だからそれは少し明確にするために、質問は以下の通りです:フラグメントの状態(リサイクルビューから位置+であるオブジェクトのリストを保存するには、アンドロイドでベストプラクティスです

何他のフィールドを表示しています)?すべてのフィールドまたはSharedPreferencesを格納するDBを使用する必要がありますか?または、私が言及しなかった/見つけた別の方法がありますか?

私の主な関心事は、このテーマとパフォーマンスに関するアンドロイドのベストプラクティスです。

+0

、および状態が自動的に保持されます:

は、ここに詳細を参照してください。何もする必要はありません。 – Abbas

+0

はい、しかし、私はOutOfMemory例外をいくつかの時点で取得し、それは私が避けようとしているものです... –

+1

DBにデータを保存し、該当する場合は[CursorAdapter](https://developer.android .com/reference/android/widget/CursorAdapter.html)は、DBからデータセットを効率的にロードするのに優れているか、単に[Loaders](https://developer.android.com/guide/components/loaders.html)を使用するだけです。 – Abbas

答えて

0

です(結論)私は、この質問に関するベストプラクティスは、フラグメントを再作成するために必要なすべての属性を格納していれば、データベースを使用することだとわかります。 データベースに関して、私はいくつかの研究を行ったREALMライブラリについて読んで、それは非常に使いやすいライブラリであり、非常に複雑であることがわかりました。あなただけの断片が `add`と` remove`操作を試してみてください置き換えるというし、その後、全てのフラグメントの状態を維持したい場合は https://realm.io/docs/java/latest/

0

あなたはこれが私のMain2Activityコードここ

public class Main2Activity extends AppCompatActivity { 
private FragmentTabHost mTabHost; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main2); 
    mTabHost = (FragmentTabHost) findViewById(android.R.id.tabhost); 
    mTabHost.setup(this, getSupportFragmentManager(), android.R.id.tabcontent); 

    mTabHost.addTab(
      mTabHost.newTabSpec("tab1").setIndicator("Tab 1", null), 
      Tab1Fragment.class, null); 
    mTabHost.addTab(
      mTabHost.newTabSpec("tab2").setIndicator("Tab 2", null), 
      Tab2Fragment.class, null); 
    mTabHost.addTab(
      mTabHost.newTabSpec("tab3").setIndicator("Tab 3", null), 
      Tab3Fragment.class, null); 

}} 

で、それは自動的に状態 を維持するフラグメントでTabHostを使用することのためのlookin試してみてくださいすることはいくつかのより多くの研究の後、私のactivity_main2.xml

<android.support.v4.app.FragmentTabHost 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@android:id/tabhost" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" > 

    <LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:orientation="vertical" > 



     <FrameLayout 
      android:id="@android:id/tabcontent" 

      android:layout_width="fill_parent" 
      android:layout_height="0dp" 
      android:layout_weight="1" /> 
     <TabWidget 
      android:id="@android:id/tabs" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:layout_gravity="bottom"/> 
    </LinearLayout> 

</android.support.v4.app.FragmentTabHost> 
+0

あなたの問題は解決しましたか? –

関連する問題