【问题标题】:Checking current opened fragment position while using DrawerLayout使用 DrawerLayout 时检查当前打开的片段位置
【发布时间】:2013-09-01 16:49:25
【问题描述】:

我正在使用支持库中的 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 进行检查吗?

【问题讨论】:

    标签: java android android-layout drawerlayout


    【解决方案1】:

    我会补充@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 
    }
    

    希望这会有所帮助。

    【讨论】:

    • 如果我使用滑动抽屉,那我怎么才能得到它?
    【解决方案2】:

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

    int lastPosition = -1;
    private void selectItem(int position) {
    
        if( position != lastPosition ) {
    
           [ old method body here ]
    
           lastPostion = position;
        }
    }
    

    【讨论】:

      【解决方案3】:

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

      您也可以将FragmentManagerfindFragmentById() 用于相同目的,并使用片段的ID。

      【讨论】:

        【解决方案4】:

        如果您绝对确定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;
                }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多