MainActivity を使用して、いくつかのフラグメントの表示を管理しています。フラグメント配列を反復処理し、それらを表示/非表示にし、それに応じてバックスタックを設定する showFragment メソッドがあります。問題は、戻るボタンを押すたびに、HomeFrag が表示され、他のすべてのフラグメントがその下に積み上げられることです。ドキュメントから、戻るボタンが最後のトランザクション (コミット前に追加されたもの) を元に戻すという印象を受けました。これがこの予期しない動作を引き起こしている理由を誰か説明できますか? ここが私の主な活動です。フラグメントはすべて activity_main.xml で定義されています。
public class MainActivity extends MenuBaseActivity {
private static final int HOME = 0;
private static final int WRITE = 1;
private static final int UPLOAD = 2;
private static final int SHARE = 3;
private static final int SNAP = 4;
private static final int POSITION = 5;
private static final int FRAGMENT_COUNT = POSITION + 1;
/** The current fragment being displayed **/
private int mCurrentFragment = -1;
private Fragment[] fragments = new Fragment[FRAGMENT_COUNT];
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
FragmentManager fm = getSupportFragmentManager();
fragments[HOME] = fm.findFragmentById(R.id.homeFrag);
fragments[WRITE] = fm.findFragmentById(R.id.writeFrag);
fragments[UPLOAD] = fm.findFragmentById(R.id.uploadFrag);
fragments[SHARE] = fm.findFragmentById(R.id.shareFrag);
fragments[SNAP] = fm.findFragmentById(R.id.snapFrag);
fragments[POSITION] = fm.findFragmentById(R.id.positionFrag);
// If no fragments are currently being displayed, show the home frag
if(mCurrentFragment == -1) {
showFragment(0,true);
}
}
/*
* Handles the click event for all navigation buttons (navOnClick) in the fragments.
*/
//TODO: Tag navigation with text strings instead of integers
public void navOnClick(View v) {
Object objectTag = v.getTag();
int tag = Integer.valueOf(objectTag.toString());
showFragment(tag, true);
}
public void showFragment(int fragmentIndex, boolean addToBackStack) {
Log.v(Constants.getLogTag(), "Main: fragmentIndex:" + fragmentIndex + " backstack:" + addToBackStack);
FragmentManager fm = getSupportFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
//ft.setCustomAnimations(R.anim.slide_in_left, R.anim.slide_out_right);
for (int i = 0; i < fragments.length; i++) {
if (i == fragmentIndex) {
ft.show(fragments[i]);
} else {
ft.hide(fragments[i]);
}
}
if (addToBackStack) {
Log.v(Constants.getLogTag(), "Main: Adding to backstack");
ft.addToBackStack(null);
}
//Update the current fragment identifier
mCurrentFragment = fragmentIndex;
ft.commit();
}
}