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

Java 如何在一个活动中切换两个片段?,java,android,xml,android-fragments,Java,Android,Xml,Android Fragments,我在应用程序栏中有两个fragment类和两个按钮-每个按钮执行以下操作之一: 检查是否存在来自其他类的片段 如果存在,则将容器替换为其片段类的新实例 如果不存在,则创建他的片段类的新实例 以下是示例代码: private void openReader() { FragmentManager fragmentManager = getFragmentManager(); ArticleListFragment fragmentList = (ArticleListFragm

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

  • 检查是否存在来自其他类的
    片段
  • 如果存在,则将容器替换为其
    片段
    类的新实例
  • 如果不存在,则创建他的
    片段
    类的新实例
  • 以下是示例代码:

    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(...);
        }
    
    }
    
    下面是
    活动
    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
    函数不是
    销毁
    旧的
    fragment
    类-它是随着按钮的单击而相互添加越来越多的片段


    谁能告诉我做错了什么吗?

    我犯了很多错误:

  • 我没有指定片段的ID
  • 由于我无法动态设置片段ID,因此需要使用标记

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

  • 我只需要使用
    findFragmentByTag()
    ,因为
    isInLayout()
    总是给我false

  • 以下是该函数的工作版本:

    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(...);
            }
        }
    

    我犯了很多错误:

  • 我没有指定片段的ID
  • 由于我无法动态设置片段ID,因此需要使用标记

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

  • 我只需要使用
    findFragmentByTag()
    ,因为
    isInLayout()
    总是给我false

  • 以下是该函数的工作版本:

    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(...);
            }
        }