FragmentsでFragmentsを適切に使用するにはどうすればよいですか?
私の(簡略化された)使用例は次のとおりです。レイアウトフラグメントのあるアクティビティがあり、このフラグメント自体にサブフラグメントが含まれています...すべてのフラグメントは親に手動で追加されます...
----------------------------------------------------------
- Activity -
- -
- -
- --------------------------------------- -
- - Fragment - -
- - - -
- - ----------------- - -
- - - SubFragment - - -
- - - - - -
- - - - - -
- - ----------------- - -
- --------------------------------------- -
- -
----------------------------------------------------------
今私の活動のonCreate
で私は以下を行います:
if (savedInstanceState == null)
{
// I create the fragment
mMainFragment = new MainFragment();
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.fragment_main, mMainFragment);
transaction.commit();
}
else
{
// I retrieve the fragment
mMainFragment = (BaseFragment) getSupportFragmentManager().findFragmentById(R.id.fragment_main);
}
そして私のフラグメントでonCreate
私は私のSubFragmentを取得/作成します:
mSubFragment = getChildFragmentManager().findFragmentByTag(SubFragment.class.getName());
if (mSubFragment == null)
{
mSubFragment = new SubFragment();
getChildFragmentManager().beginTransaction().add(R.id.fragment_sub, mSubFragment, SubFragment.class.getName()).commit();
}
問題
画面の回転後、SubFragmentが2回追加されます...アクティビティのFragmentManager
を使用すると機能しますが、ChildFragmentManager
で機能しないのはなぜですか?もちろん、Fragmentは新しいフラグメントですが、アクティビティも新しいものなので、なぜそれがアクティビティのFragmentManager
で機能し、親フラグメントのフラグメントでは機能しないのですか?
フラグメントでは、フラグメントChildFragmentManager
を使用する必要がありますか?
SubFragment
をFragment
に追加するのと同じ方法で、Fragment
をActivity
に追加する必要があります。つまり、Fragment
をActivity
に追加すると、次のようになります。
@Override
public void onCreate(Bundle savedInstanceState) {
....
if (savedInstanceState == null){
//add fragment
mMainFragment = new MainFragment();
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.fragment_main, mMainFragment);
transaction.commit();
}
}
SubFragment
をMainFragment
に追加すると、次のようになります。
public class MainFragment extends Fragment{
@Override
public View onCreateView(LayoutInflater i, ViewGroup c, Bundle savedInstanceState) {
...
if (savedInstanceState == null){
mSubFragment = new SubFragment();
//add child fragment
getChildFragmentManager()
.beginTransaction()
.add(R.id.fragment_sub, mSubFragment, "tag")
.commit();
}
}
}
または、Fragment
メソッドのonCreate
に子フラグメントを追加できます