7

それが役立つ場合、私が欲しいのは、このGoogleチュートリアルで行われていることと似ています

ただし、遷移の前にフラグメントが作成されます。これを行うと、移行は正常に機能します。しかし、私はこのアプローチを使用できません

=====

API 7+を目指して、画面全体に1つのフラグメントを表示し、ボタン(onTouchイベントを使用して描画されたボタン)を使用してから、2番目のフラグメントに切り替え、その逆を試みています。

しかし、最初のフラグメントを 2 番目のフラグメントに置き換えるか、fragmentTransaction.show と fragmentTransaction.hide を使用すると、空白の画面が表示されます。空白の画面になる前に2回切り替えることができます。バックスタックに入れたくありません。

MainActivity の onCreate でフラグメントを作成しています。

DiceTable diceTable = new DiceTable();
Logger logger = new Logger();
fragmentTransaction.add(diceTable, DICETABLE_TAG);
fragmentTransaction.add(logger, LOGGER_TAG);
fragmentTransaction.add(R.id.fragment_container, logger);
fragmentTransaction.add(R.id.fragment_container, diceTable);

次に、1 つのメソッド (フラグメントから呼び出される) で切り替えを行います。

    Logger logger = (Logger)fragmentManager.findFragmentByTag(LOGGER_TAG);
    DiceTable diceTable = (DiceTable)fragmentManager.findFragmentByTag(DICETABLE_TAG);

    if (diceTable.isVisible()) {
        fragmentTransaction.replace(R.id.fragment_container, logger);

        fragmentTransaction.commit();
        fragmentTransaction.hide(diceTable);
        fragmentTransaction.show(logger);
    }
    else if (logger.isVisible()) {
        fragmentTransaction.replace(R.id.fragment_container, diceTable);

        fragmentTransaction.commit();
        fragmentTransaction.hide(logger);
        fragmentTransaction.show(diceTable);
    }

これは私がこれを行うべき方法ではありませんか?

フラグメント置換時のブランク画面

4

3 に答える 3

6

その方法でフラグメントを初期化してみてください:

private void initFragments() {
    mDiceTable = new DiceTable();
    mLogger = new Logger();
    isDiceTableVisible = true;

    FragmentManager fm = getSupportFragmentManager();
    FragmentTransaction ft = fm.beginTransaction();
    ft.add(R.id.fragment_container, mDiceTable);
    ft.add(R.id.fragment_container, mLogger);
    ft.hide(mLogger);
    ft.commit();
}

そして、そのようにそれらを切り替えます:

 private void flipFragments() {
        FragmentManager fm = getSupportFragmentManager();
        FragmentTransaction ft = fm.beginTransaction();
        if (isDiceTableVisible) {
            ft.hide(mDiceTable);
            ft.show(mLogger);
        } else {
            ft.hide(mLogger);
            ft.show(mDiceTable);
        }
        ft.commit();
        isDiceTableVisible = !isDiceTableVisible;
    }
于 2013-05-14T15:21:02.347 に答える
1

表示されるフラグメントを変更する 2 つの異なる方法を組み合わせています。

  • replace()コンテナの内容を別の Fragment に置き換える呼び出し
  • hide()Fragment を削除するために呼び出してから、show()別の Fragment を表示するために呼び出します。

1 つの方法を選択し、それを固守します。Building a Flexible UI guide ではメソッドのみを使用しているため、 およびreplace()へのすべての呼び出しを削除することから始めます。show()hide()

Android Fragments: When to use hide/show or add/remove/replace?も参照してください。置換の代わりに非表示/表示を使用することが有益な場合の簡単な概要については、 を参照してください。

于 2013-05-14T14:58:49.280 に答える