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

4 回答 4

7

我会添加到@Plato 的答案。如果您还没有,请检查获取当前显示的片段问题。

答案是当你在你的事务中添加片段时,你可以使用一个标签来表示一个特定的片段。就像是:

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 
}

希望这可以帮助。

于 2013-06-22T17:53:53.480 回答
3

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

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

    if( position != lastPosition ) {

       [ old method body here ]

       lastPostion = position;
    }
}
于 2013-06-22T17:49:17.280 回答
3

为每个片段分配不同的标签并调用findFragmentByTag()FragmentManager检查每个片段是否已经存在。

您也可以将findFragmentById()FragmentManager用于相同目的并使用片段的 id。

于 2013-06-22T17:49:27.457 回答
0

如果您绝对确定 , , 中的每一个fragment1不能fragment2同时fragment3可见,并且如果您重用相同的片段(即每次更改位置时不要创建新片段)isVisible(),那么类中的方法Fragment应该告诉您该片段是否当前可见。

您的开关应如下所示:

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;
        }
于 2013-06-22T18:14:41.443 回答