在使用DrawerLayout时,如何检查当前打开的片段位置?

3

我正在使用来自支持库的Android DrawerLayout来显示滑动菜单。我使用单个活动和5-6个片段来根据在DrawerLayout菜单中的选择显示它们。但是我有一个小问题,那就是“如何检查哪个片段当前可见,以便如果用户选择对应于已打开片段的菜单项,则不会再次创建并显示它”。目前它会创建并显示该片段,这不太好。当点击菜单项时触发的函数是:

private void selectItem(int position) {

        FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
        // Locate Position
        switch (position) {
        case 0:
            ft.replace(R.id.content_frame, fragment1);
            break;
        case 1:
            ft.replace(R.id.content_frame, fragment2);
            break;
        case 2:
            ft.replace(R.id.content_frame, fragment3);
            break;
        }
        ft.commit();
        mDrawerList.setItemChecked(position, true);
        // Close drawer
        mDrawerLayout.closeDrawer(mDrawerList);
    }

我该如何检查请求的片段是否已经打开,以便不重复创建它?是否有通过FragmentManager检查此项的方法?
4个回答

7
我会为@Plato的答案添加一些内容。 如果您还没有查看过,请查看“获取当前显示的片段”问题:get currently displayed fragment
答案说,当您在事务中添加片段时,可以使用标签表示特定片段。类似于:
ft.replace(android.R.id.content, fragment, "MY_FRAGMENT");

稍后如果你想要检查该片段是否可见,可以像这样做:

RequestedFragment fragment = (RequestedFragment)getFragmentManager().findFragmentByTag("MY_FRAGMENT"); //"My_FRAGMENT" is its tag
if (fragment.isVisible()) {
   // add your code here 
}

希望这能有所帮助。

如果我正在使用滑动抽屉,那么如何获取它? - Vishal Thakkar

3

最简单的方法是存储上次使用的position,并在下一次进行比较。只需将您的selectItem方法设置为:

int lastPosition = -1;
private void selectItem(int position) {

    if( position != lastPosition ) {

       [ old method body here ]

       lastPostion = position;
    }
}

3
给每个片段分配不同的标签,然后调用FragmentManagerfindFragmentByTag()方法来检查每个片段是否已经存在。
您还可以使用FragmentManagerfindFragmentById()方法实现相同的目的,并使用片段的ID。

0
如果您绝对确定fragment1fragment2fragment3中的每一个都不可能同时可见,并且如果您重复使用相同的片段(即每次更改位置时不创建新片段),那么来自Fragment类的isVisible()方法应该告诉您该片段当前是否可见。
您的开关应该如下所示:
switch (position) {
        case 0:
            if(!fragment1.isVisible()) {
              ft.replace(R.id.content_frame, fragment1);
            }
            break;
        case 1:
            if(!fragment2.isVisible()) {
              ft.replace(R.id.content_frame, fragment2);
            }
            break;
        case 2:
            if(!fragment3.isVisible()) {
              ft.replace(R.id.content_frame, fragment3);
            }
            break;
        }

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