如何在一个活动中切换两个片段?

时间:2015-06-28 20:59:46

标签: java android xml android-fragments

我在应用程序栏中有两个fragment类和两个按钮 - 每个按钮执行以下操作之一:

  1. 检查其他类中是否存在fragment
  2. 如果存在,请使用其fragment
  3. 的新实例替换容器
  4. 如果不存在,则创建他的fragment
  5. 的新实例

    以下是示例代码:

    private void openReader() {
    
        FragmentManager fragmentManager = getFragmentManager();
    
        ArticleListFragment fragmentList = (ArticleListFragment) fragmentManager.findFragmentById(R.id.action_list);
        ArticleReaderFragment fragmentReader = (ArticleReaderFragment) fragmentManager.findFragmentById(R.id.action_reader);
    
        if (fragmentReader==null || ! fragmentReader.isInLayout()) {
    
            if (fragmentList==null || ! fragmentList.isInLayout()) {
    
                FragmentTransaction ft = fragmentManager.beginTransaction();
                ft.add(R.id.container_id, new ArticleReaderFragment());
                //ft.addToBackStack(null);
                ft.commit();
    
            } else {
    
                FragmentTransaction ft = fragmentManager.beginTransaction();
                ft.replace(R.id.container_id, new ArticleReaderFragment());
                //ft.addToBackStack(null);
                ft.commit();
    
            }
        }
        else {
            // fragment.update(...);
        }
    
    }
    

    这里是activity XML:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="horizontal"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/welcome_page">
    
        <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
            android:orientation="horizontal"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:id="@+id/container_id">
    
        </FrameLayout>
    
    </LinearLayout>
    

    问题是replace函数不是destroying旧的fragment类 - 它会在点击按钮时相互添加越来越多的碎片。

    有谁能说出我做错了什么?

1 个答案:

答案 0 :(得分:0)

我犯了很多错误:

  1. 我没有指定片段的ID
  2. 由于我无法动态设置片段ID,我需要使用标签

    ft.replace(R.id.container_id, new ArticleListFragment(), "Action_list");
    

    ft.add(R.id.container_id, new ArticleListFragment(), "Action_list");
    
  3. 我只需要使用findFragmentByTag()因为isInLayout()总是给我错误。

  4. 以下是该功能的工作版本:

    private void openList() {
    
            FragmentManager fragmentManager = getFragmentManager();
    
            ArticleListFragment fragmentList = (ArticleListFragment) fragmentManager.findFragmentByTag("Action_list");
            ArticleReaderFragment fragmentReader = (ArticleReaderFragment) fragmentManager.findFragmentByTag("Action_reader");
    
            if (fragmentList==null) {
    
                if (fragmentReader==null) {
    
                    FragmentTransaction ft = fragmentManager.beginTransaction();
                    ft.add(R.id.container_id, new ArticleListFragment(), "Action_list");
                    //ft.addToBackStack(null);
                    ft.commit();
    
                } else {
    
                    FragmentTransaction ft = fragmentManager.beginTransaction();
                    ft.replace(R.id.container_id, new ArticleListFragment(), "Action_list");
                    //ft.addToBackStack(null);
                    ft.commit();
    
                }
            }
            else {
                // fragment.update(...);
            }
        }