我遇到的场景是在我的应用程序中,我有一个单 Pane 和一个双 Pane 样式布局。对于每种不同的布局样式,我使用的功能不是在屏幕之间单独处理每个导航操作,而是在给定所需的屏幕时正确设置布局。

它基本上是应用程序中每个屏幕的switch语句,每个屏幕中都有一个嵌套的switch语句来处理每种布局样式。这就是我在代码中谈论的内容:

protected void setupScreen() {
    switch(currentScreen) {
    case SCREEN_ONE:
        switch(currentLayout) {
        case SINGLE_PANE:
            // Perform actions to setup the screen
            break;
        case DUAL_PANE:
            // Perform actions to setup the screen
            break;
        }
        break;
    case SCREEN_TWO:
        switch(currentLayout) {
        case SINGLE_PANE:
            // Perform actions to setup the screen
            break;
        case DUAL_PANE:
            // Perform actions to setup the screen
            break;
        }
        break
    // ... etc ....
    }
}

在我要执行的操作来设置屏幕的部分中,这包括以下三个基本操作:
// Create the fragments if necessary
if (screenFragment == null) {
    screenFragment = new myFragment();
}

// Remove the existing fragments from the layout views
// HOW???

// Add the fragments for this screen to the view
getSupportFragmentManager().beginTransaction().add(pane1.getId(), myFragment, "myFragment").commit();

如您所见,我在努力工作的是,如何用完成第二步。 如何在不确切知道要删除哪些Fragment的情况下从给定的View删除所有FragmentTransaction.replace()?我发现的最接近的是Fragment,它可以在每种情况下成功完成但可以成功完成此操作,但事实证明您要用相同的 fragment 替换FragmentTransaction.replace()。在这种情况下,它不会删除所有内容,而是添加(就像文档中所建议的那样),只是删除了它。这是使用兼容性库的问题吗?还是不应该使用removeAllFragments()的方式?

无论如何,我应该怎么做呢?我是否必须编写一个FragmentTransaction.replace()函数以遍历每个 fragment 并将其分离,或者是否有办法完成ojit_code函数“二合一”的上半部分?

最佳答案

典型的机制是使用 FragmentManager.findFragmentByTag() 。您可以使用它并在 fragment 中添加标签(或ID的替代物)。这样,您可以确定当前正在管理哪些 fragment 。然后,一旦您拥有当前 fragment 的句柄(findFragmentByTag返回非空),就可以使用 FragmentManager.beginTransaction() 启动FragmentTransaction并删除/添加必要的 fragment 。以这种方式工作将使您避免要保留的 fragment 的“重新添加”过程。

我可能会做的是这样的代码:(警告伪代码)

Fragment pane1 = FragmentManager.findFragmentByTag("myFragmentPane1");
Fragment pane2 = FragmentManager.findFragmentByTag("myFragmentPane2");

setupScreen(pane1, pane2);

您还应该考虑类(class)的子类(class),而不是“将所有内容都放在一个类(class)中”。您有一个很明显的马丁·福勒(Martin Fowler)的Replace Conditional with Subclass案例。否则,我担心添加另一个屏幕时,这将很难管理。

关于android - fragment : Remove all fragments in a view,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14764043/

10-13 01:20