2016-10-18 1 views
1

FragmentPagerAdapterを使用して、私のメインのアプリケーションクラスのOnCreate()ListFragmentを表示しています。単に:アクティビティがフラグメントを再作成しないようにする方法

viewPager = (ViewPager) findViewById(R.id.viewpager); 


    ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager()); 
    adapter.addFragment(new TripListFragment(), "Reissulista"); 
    viewPager.setAdapter(adapter); 

    tabLayout = (TabLayout) findViewById(R.id.tabs); 
    tabLayout.setupWithViewPager(viewPager); 

ViewPagerAdapterは少しFragmentPagerAdapterを拡張し、TripListFragmentListFragmentです。

これはうまくいきますが、アプリケーションが長い間、背中の上にあって破棄されてしまった場合、再開時にアプリがクラッシュします。 ListFragmentはメインアクティビティから直接データにアクセスし、データはまだロードされません。ただし、フラグメント番号をOnCreateに追加する前にデータがロードされます。

super.OnCreate()の残りが私のOnCreateが完了する前にメモリから断片を再構築しようとしていることがわかりました。

質問は、どのようにしてOnCreateスーパーメソッドが私のものを作り直して、それを適切な方法でやり直さないようにすることができますか?そして私はすべきですか? ListFragmentに必要なデータを保持させる方が適切でしょうか。しかし、もし私がそれをしたら、私は新しいものを作成するときに、メモリのどこかに重複フラグメントを取得しませんか?

+1

私は解決策はありませんが、アクティビティがフラグメントを再作成したい場合は、そのことを防ぐ必要はありません。代わりにそれを使用することを学ぶ –

+1

あなたはライフサイクルメソッドの制約の中で価値があるべきであり、それらを破壊しようとはしません。 –

答えて

0

ViewPagerAdapter実装を変更して、フラグメントが各oncreateで再作成されないようにしました。前にリストベースの実装をしていましたが、今は、フラグメントがgetItem()に存在する(存在しない場合)より一般的な実装に依存しています。

データが作成される前に、データ作成後にsuper.oncreate()を移動するだけで、フラグメントが再現される問題が発生します。

1

"ListFragmentは、Activityメインから直接データにアクセスし、データはまだロードされていません。"

これは問題のようです。データがあることを知るまで、データを読み込まないでください。私はこれを行うためにリスナーなどを使用します。あなたがデータをロードするAsyncTaskを実行している場合はおそらく、あなたの活動の内側に、あなたはこのようにそれを表示するには、Fragmentを伝えることができます。

protected void onPostExecute(String result) { 
    //TODO: Implement your own way 
    ((MyFragment)getFragment()).displayData(result); 
} 

明らかにこれは非常に広いの説明であり、あなたの問題に合わせてカスタマイズする必要がありますただし、データが表示されるまで待つことができれば、クラッシュする必要はありません。

+0

私は自分自身を良くしておくべきです。データはsharedpreferencesからロードされます。スレッドはありません。UIスレッド上ですばやく実行されます。それはリストビューのコンテンツ配列です。 – Migzu

+0

ああ、私の間違いを参照してください。私はこの答えを1分で止めるつもりだ、もし何かを考えるなら、私はそれを元に戻すだろう。@Migzu – AdamMc331

+0

議論の目的のために削除されていない、私の心を変えた。 – AdamMc331

0

アクティビティとフラグメントの両方のライフサイクルメソッドの制約内でデータにアクセスできるように、デザインを再作成する必要があります。

0

あなたは断片的にsetRetainInstanceを使用することができます。これは再作成されたフラグメントの問題を解決することを

Class MyFragment extends Fragment { 

    public MyFragment() { 
     setRetainInstance(true); 
    } 

} 

マインドを、活動はまだライフサイクルごとに再作成されます。ただし、フラグメント内で既に参照しているデータはそのまま残ります。フラグメントやアクティビティを直接接続しないでください。onResumeやonPauseやonDestroyでフラグメントの特定のメソッドを呼び出すアクティビティをお勧めします。

関連する問題