安卓中的碎片事务导致空白屏幕

7
如果有帮助的话,我想要的与谷歌教程中所做的类似。
但是在过渡之前创建了一个片段。如果我这样做,过渡就可以正常工作;但我不能使用这种方法。

=====

为了适配API 7+,我想让一个片段在整个屏幕上可见,并使用一个按钮(一个绘制的按钮,带有一个onTouch事件),然后交替显示第二个片段和第一个片段。

但是当我用第二个片段替换第一个片段时,要么得到一个空白屏幕,要么使用fragmentTransaction.show和fragmentTransaction.hide; 我可以切换两次,然后就会得到一个空白屏幕。我不想在回退栈中保留。

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

这不是我应该做的方式吗?
替换片段时出现空白屏幕。
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;
    }

1
您正在结合两种不同的更改Fragment的方法:
  • 调用replace()以替换容器的内容为另一个Fragment
  • 调用hide()以删除一个Fragment,然后调用show()以显示另一个Fragment。
选择一种方法并坚持使用它。构建灵活UI指南仅使用replace()方法,因此我建议尝试删除所有对show()hide()的调用。
另请参见Android Fragments: When to use hide/show or add/remove/replace?,了解何时使用hide/show而不是replace可能会有益的快速摘要。

0

如果有人尝试了所有已经建议的答案,但仍然遇到问题,就像我几分钟前一样,那么问题可能来自于不同于片段的源。

在我的情况下,我正确地切换了片段,但是空白屏幕的原因是每次在新片段中尝试通过启动新的Thread异步加载图像(类似于this)而不是推荐的AsyncTask或者更好的newSingleThreadExecutor,因为AsyncTask已经过时了。

我打扰了后台,所以片段不会显示出来,除非我导航到另一个应用程序然后返回。

所以,除非你的错误与我的相似,否则我的建议可能有点含糊不清,但请尝试查看你的片段是否存在任何可能对资源产生压力的情况(注释掉不同的代码片段可以帮助调查)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接