7

如果有帮助,我想要的类似于这个谷歌教程中所做的

但是在过渡之前会创建一个片段。如果我这样做,过渡效果很好;但我不能使用这种方法

=====

针对 API 7+,我只是想让一个片段在整个屏幕上可见,并使用一个按钮(一个绘制的按钮,带有一个 onTouch 事件)然后交替到第二个片段,反之亦然。

但是当我用第二个片段替换第一个片段时,或者如果我使用 fragmentTransaction.show 和 fragmentTransaction.hide 时,我会得到一个空白屏幕;在出现黑屏之前,我可以切换两次。我不想在 backstack 上。

我在 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);

然后在一种方法(从片段中调用)我进行切换:

    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

您正在结合两种不同的方法来更改显示的片段:

  • 调用replace()用不同的 Fragment 替换容器的内容
  • 调用hide()删除一个片段,然后调用show()显示另一个片段。

选择一种方法并坚持下去。构建灵活的 UI 指南仅使用该replace()方法,因此我将首先尝试删除您对show()and的所有调用hide()

另请参阅Android 片段:何时使用隐藏/显示或添加/删除/替换?快速总结何时使用隐藏/显示而不是替换可能是有益的。

于 2013-05-14T14:58:49.280 回答
0

如果有人尝试了所有已经建议的答案并且仍然面临问题,就像我刚才一样,问题可能来自与您的片段不同的来源。

在我的情况下,我在片段之间正确切换,但空白屏幕的原因是在每个新片段中,我试图通过Thread每次启动一个新片段(有点像这样)来异步加载图像,而不是推荐的AsyncTask,或者更好的是newSingleThreadExecutor,因为AsyncTask它已被弃用。

我扰乱了背景,以至于片段没有出现,除非我导航到另一个应用程序然后返回。

因此,除非您的错误与我的相似,否则我的建议可能有点含糊,但请尝试查看您的片段中是否发生了可能占用资源的任何事情(注释掉不同的代码段可能有助于调查此问题)。

于 2021-10-20T11:13:05.430 回答