2016-08-11 6 views
0

元々、MainActivityクラスに1つのフラグメントがロードされていました。私はのonCreateFragmentPagerAdapterを使用してアクティビティからフラグメントメソッドを呼び出す

if (savedInstanceState == null) { 
      getSupportFragmentManager().beginTransaction() 
        .add(new TimeTableFragment(), TIMETABLEFRAGMENT_TAG) 
        .commit(); 
     } 

に以下と

onResume

if(*setting has changed*){ 
TimeTableFragment tf = (TimeTableFragment) getSupportFragmentManager() 
        .findFragmentByTag(TIMETABLEFRAGMENT_TAG); 
      if (null != tf) { 
       tf.onStudentIdChanged(); 
      } 
} 

onStudentIdChanged()方法WOUに使用しましたldは、プリファレンス設定が変更されたときにフラグメントデータをリフレッシュします。

このアクティビティではFragmentPagerAdapterを使用し、2つの異なるフラグメントをタブに読み込むようにリファクタリングしました。どちらのフラグメントも同じTimetableFragmentクラスのインスタンスですが、作成時に異なるパラメータが渡されます。

FragmentPagerAdapter方法

TimetableFragment方法

public static TimeTableFragment newInstance(int sectionNumber) { 
     TimeTableFragment fragment = new TimeTableFragment(); 
     Bundle args = new Bundle(); 
     args.putInt(ARG_SECTION_NUMBER, sectionNumber); 
     fragment.setArguments(args); 
     return fragment; 
    } 

さて、これは私のMainActivityonResumeで、動作していることを私はもはやフラグメントにアクセスすることができていませんを使用してこれらは、onCreateの間にこのように追加されておらず、私はもはやonStudentIdChangedメソッドを呼び出すことができないので、

タイムテーブルフラグメントのすべての作成インスタンスに対して、このメソッドを呼び出してデータを更新/更新できますか?あなたのFragmentPagerAdapter imprementationで

+0

フラグメントは、アクティビティからの更新のために明示的に「コールアウト」するのではなく、イベントに「購読する」ようにする必要があります。これはオブザーバパターンと呼ばれます。 –

答えて

1

、次のようにあなたのgetItemメソッドを変更しprivate SparseArray<Fragment> mFragments = new SparseArray<Fragment>();

を追加します。

@Override 
public Fragment getItem(int position) { 
    // getItem is called to instantiate the fragment for the given page. 
    // Return a Fragment 
    Fragment fragment = null; 
    switch (position) { 
     case 1: 
     case 2: 
     fragment = mFragments.get(position); 
     if (fragment == null) { 
      fragment = TimeTableFragment.newInstance(position); 
      mFragments.append(position, fragment) 
     } 
     break; 
     case 0: 
     //todo add the single day here 
     fragment = mFragments.get(position); 
     if (fragment == null) { 
      fragment = TimeTableFragment.newInstance(position); 
      mFragments.append(position, fragment) 
     } 
     break; 
    } 

    return fragment; 
} 

今、あなたは位置によってフラグメントのインスタンスを取得することができるとき。