ユーザーがリストの製品をクリックするたびに開く製品詳細ページに取り組んでいます。ページの上部に製品画像があり、画像の下に 3 つのタブがあり、タブの下にフラグメント コンテナーがあり、タブを切り替えます。
問題:初めてアクティビティをロードすると、showFragment(..)
メソッドが呼び出さfragment_container
れ、InfoFragment が読み込まれます。次に別のタブをクリックしてshowFragment()
メソッドを再度呼び出すと、コンテナが空白になります。面白いことに、リストに戻って同じ製品をもう一度クリックすると、infoFragment
以前と同じようにコンテナに読み込まれますが、タブをクリックするとバターのように切り替わります (問題なし)。何がうまくいかないのですか??
これは、onCreate()
開始時に infoFragment を表示するために呼び出すメソッドです。
showFragment(R.id.product_detail_fragment_container, mInfoFragment, INFO_TAG, mCurrentFragmentTag, false);
別の (2 番目の) タブをクリックすると、同じメソッドが異なるパラメーターで呼び出されます。
showFragment(R.id.product_detail_fragment_container, mCaraFragment, CARA_TAG, mCurrentFragmentTag, false);
そしてshowFragment(...)
方法:
protected void showFragment(int resId, Fragment fragment, String tag, String lastTag, boolean addToBackStack)
{
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction transaction = fragmentManager.beginTransaction();
if (lastTag != null) {
Fragment lastFragment = fragmentManager.findFragmentByTag(lastTag);
if (lastFragment != null) {
transaction.setCustomAnimations(R.anim.fade_in, R.anim.fade_out);
transaction.hide(lastFragment);
}
}
if (fragment.isAdded()) {
transaction.show(fragment);
} else {
transaction.add(resId, fragment, tag).setBreadCrumbShortTitle(tag);
}
if (addToBackStack) {
transaction.addToBackStack(tag);
}
transaction.commit();
}
コンテナーの XML:
<FrameLayout
android:id="@+id/product_detail_fragment_container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@android:color/white" />
コードをデバッグしようとしましたtransaction.add(resId, fragment, tag)
が、タブを切り替えるとメソッドが呼び出されますが、コンテナーが空白になります。次に、詳細ページを閉じて再度開始すると、メソッドが呼び出され、コンテンツが表示されます...別の製品を試してみると、戻ってもう一度クリックするまでフラグメントが表示されません