java - 如何在一个 Activity 中切换两个 fragment ?

标签 java android xml android-fragments

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

  1. 检查其他类的 fragment 是否存在
  2. 如果存在,则用其 fragment 类的新实例替换容器
  3. 如果不存在,则创建其 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(...);
    }

}

这是 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 函数并没有破坏旧的fragment 类 - 它会在单击按钮时相互添加越来越多的 fragment 。

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

最佳答案

我犯了很多错误:

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

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

    ft.add(R.id.container_id, new ArticleListFragment(), "Action_list");
    
  3. 我只需要使用 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(...);
        }
    }

关于java - 如何在一个 Activity 中切换两个 fragment ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31104691/

相关文章:

java - 错误 : syntax error at or near "$1" postgresql query with params

java - 如何正确使用反射访问 Telephony Manager 中的隐藏方法

java - 选择某个按钮后如何取消选中单选组?

xml - 使用 PowerShell 在 Xml 中添加元素

html - 使用 CURL 获取 XML 格式的网页数据

java - 序列化和反序列化 transient 对象的棘手情况

java - 在android中从Uri获取完整路径名

java - 从java发送到宝丽来打印机

java - 从网站上读取行

c# - 我将如何读写加密的 XML 文件?