4

问题是要正确管理回栈,以便弹出(或删除)前一个片段。问题在于它们的重叠..

程序结构如下:

  • 滑动菜单,每个部分有 3 个片段:CatalogFragment, NewsFragment, BlogFragment;
  • 每个片段都是一个带有项目的列表视图(从 JSON 解析);
  • onCatalogFragment的项目单击我需要将其替换CatalogFragmentLessonsFragment,这也是列表。

ps Items 是俄语,但我想你可以理解

在此处输入图像描述

这就是(动态)添加这些片段的方式:

    @Override
public void onNavigationDrawerItemSelected(int position) {
    FragmentManager fragmentManager = getSupportFragmentManager();
//        fragmentManager.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE); //this also doesn't work

    switch (position+1) {
        case 1:
            //getSupportFragmentManager().popBackStack(); // this doesnt work
            fragmentManager.beginTransaction().replace(R.id.container,
                    CatalogFragment.newInstance(position + 1)).addToBackStack("catalog").commit();

            break;
        case 2:
            fragmentManager.beginTransaction().replace(R.id.container,
                    NewsFragment.newInstance(position + 1)).addToBackStack("news").commit();

            break;
        case 3:
            fragmentManager.beginTransaction().replace(R.id.container,
                    BlogFragment.newInstance(position + 1)).addToBackStack("blog").commit();
            break;
    }
}

这就是我在onCatalogFragmentInteraction接口中用新方法替换片段的方式:

    /** Methods for interaction with list items*/
@Override
public void onCatalogFragmentInteraction(String id){
    //pop previous
    getSupportFragmentManager().popBackStack("catalog", FragmentManager.POP_BACK_STACK_INCLUSIVE);
    //add new
    FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
    fragmentTransaction.replace(R.id.container, LessonsFragment.newInstance());
    fragmentTransaction.addToBackStack("lessons");
    fragmentTransaction.commit();
}

...而且效果很好:

在此处输入图像描述

但是当我从滑动菜单片段重叠回到片段时。

在此处输入图像描述

我相信问题在于正确的 BackStack 管理,但我不知道我做错了什么。另一个建议是在这种情况下我需要以add/replace某种方式更好地使用。

我已经尝试从堆栈中按名称删除。也许需要通过 ID 删除它们?

PS告诉是否需要更多代码。提前致谢。

4

6 回答 6

14

我认为你所有的片段都有透明背景或者你没有设置任何东西(所以默认是透明的)。因此,当您在另一个片段上方添加/替换片段时,您可以看到下面的片段。所以尝试为每个片段布局设置背景颜色。

于 2015-01-22T12:43:14.523 回答
2

我认为这不是完美的解决方案,但这对我有用。

long back_pressed;
@Override
public void onBackPressed()
{
    Log.d(TAG, "HERE WAS PRESSED BACK");
    int backStackEntryCount = getSupportFragmentManager().getBackStackEntryCount();
    final Fragment fragment = getSupportFragmentManager().findFragmentByTag(TAG_ANSWERS_FRAGMENT);
    if(null != fragment && fragment.isVisible()) {
        Log.d(TAG, "visible");
        showLeaveTest();
    }
    else {
        Log.d(TAG, "invisible");
        if (backStackEntryCount == 0) {
            if (back_pressed + 2000 > System.currentTimeMillis()) super.onBackPressed();
            else try {
                Toast.makeText(this, R.string.double_press, Toast.LENGTH_SHORT).show();
            } catch (Exception e) {
                e.printStackTrace();
            }
            back_pressed = System.currentTimeMillis();
        } else {
            getSupportFragmentManager().popBackStack();
            removeCurrentFragment(TAG_RESULT_FRAGMENT);
        }
    }
}

public void removeCurrentFragment(String fragmentTag)
{
    FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
    Fragment currentFrag =  getSupportFragmentManager().findFragmentByTag(fragmentTag);
    String fragName = "NONE";

    if (currentFrag != null)
        fragName = currentFrag.getClass().getSimpleName();

    Log.d(TAG, "flag name " + fragName);

    if (currentFrag != null && currentFrag.isVisible())
        transaction.remove(currentFrag);

    transaction.commit();
}

所以,我在活动中按下后退按钮,并且在弹出回栈后,当片段与另一个片段重叠时,这个重叠片段是可见的,所以我只是用事务将其删除。

于 2015-01-22T12:57:55.220 回答
2
<LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#ffffff"
        android:orientation="vertical" >

</LinearLayout>

我猜这是您的片段 xml,它可能是其他类型的布局(相对,框架或其他),尝试放置片段 xml 的父布局的背景颜色例如,我将白色作为背景。

于 2015-01-22T12:47:50.393 回答
2

尝试只传递一个空字符串作为 addToBackStack 中的片段标识符。

而不是

getSupportFragmentManager().popBackStack("catalog", FragmentManager.POP_BACK_STACK_INCLUSIVE

只需使用

getSupportFragmentManager().popBackStack();
于 2015-01-22T12:28:46.263 回答
0

只需为每个片段的父布局设置背景颜色

于 2017-05-13T22:58:56.857 回答
0

发生这种情况还有另一个原因:

  • 您正在将所有片段替换为具有 id: 的视图R.id.container

  • 假设您正在推送一个片段A,其顶级布局具有分配给它的 id,例如<LinearLayout android:id="@+id/rootLayout">

  • 现在,您推送的任何其他片段都R.id.container将与 Fragment 重叠A

因此,只需确保正在推送的片段的根布局没有分配给它的 id。

于 2015-11-02T14:27:00.340 回答