【问题标题】:Confused with remove Fragment对删除片段感到困惑
【发布时间】:2016-04-11 21:17:33
【问题描述】:

我有一个 Activity,其布局中有一个 Button 和一个 FrameLayout。 当我单击按钮时,我将片段添加到 Activity 的视图中。 如果我在单击“后退”按钮时使用addToBackStack() 将片段添加到“后退”堆栈,它就会消失。 我想通过再次单击按钮来实现相同的功能。

我的代码是这样的:

     button.setOnClickListener(new View.OnClickListener() {
         public void onClick(View v) {

             AddRemoveFragment Frag_A = new AddRemoveFragment();

             FragmentManager fm1 = getSupportFragmentManager();
             FragmentTransaction transaction = fm1.beginTransaction();

        if ( state == 0 ) {
                 Log.i(TAG, "inside IF");
                 state=1;
                 transaction.add(R.id.fragment_container_1, Frag_A);
                 transaction.addToBackStack(null);
                 transaction.commit();

             } else {
                 state=0;
                 Log.i(TAG, "inside ELSE");
                 //transaction.replace(R.id.fragment_container_1, Frag_A);
                     transaction.remove(Frag_A);
                 transaction.commit();
             }

         }
     });

remove()hide() 都不执行任何操作。 从reference 我不明白更具体的东西。只是说它从容器中删除了片段。这不是我想要的吗?从 FrameLayout 中移除片段?

编辑:希望它与支持库无关。我看到有人对此有一些问题。 Here

XML:

<?xml version="1.0" encoding="utf-8"?>

<Button
    android:id="@+id/button_frag_1"
    android:layout_width="124dp"
    android:layout_height="wrap_content"
    android:text="@string/button_text_1" />

<FrameLayout
    android:id = "@+id/fragment_container_1"
    android:layout_width="80dp"
    android:layout_height="wrap_content"
    android:layout_alignBottom="@+id/button_frag_1"
    android:layout_alignParentRight="true"
    android:layout_alignParentTop="true"
    android:layout_toRightOf="@+id/button_frag_1" >
</FrameLayout>

编辑 2:我将 else 语句中的代码从 transaction.replace(R.id.fragment_container_1, Frag_A); 更改为 transaction.remove(Frag_A);,但仍然具有相同的功能。

【问题讨论】:

    标签: android android-fragments


    【解决方案1】:

    对于片段,首先你需要记住一件事: 如果您在 XML 布局中添加了片段,那么它不能被删除,它只能使用 .show() 方法显示并使用 .hide() 方法隐藏。另一方面,如果您在代码中创建片段的实例,那么您应该使用.add() 方法添加它或使用.remove() 方法删除它。

    关于您的问题,如果您想使用按钮删除片段,我认为您不需要将片段添加到后堆栈(除非您想保留使用“后退”按钮删除片段的功能)。

    另外我认为你不需要使用replace,来自replace的文档:

    替换已添加到容器中的现有片段。这本质上与为所有当前添加的片段调用 remove(Fragment) 相同,这些片段使用相同的 containerViewId 添加,然后使用此处给出的相同参数调用 add(int, Fragment, String)。

    这意味着它用新的片段替换了容器的内容,所以你要做的就是删除你的片段并重新添加它。

    当你想显示它时你应该.add()你片段,当你不想显示它时应该.remove()它。

    更新:

    在你第二个问题之后,当我说你可以在你的 xml 中添加你的片段时,我的意思是你可以这样写:

    <fragment
        xmlns:map="http://schemas.android.com/apk/res-auto"
        android:id="@+id/listfragment"
        android:name="com.eadesign.yamba.TimeLineListFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
    

    在您的 FrameLayout 内的 XML 布局文件中,这是您的片段容器,在这种情况下,您无法删除此片段,您只能将其隐藏。

    为了澄清,您将始终必须提供某种布局,该布局将成为您的片段/片段的容器。

    与此相反,您可以在代码中执行您正在执行的操作:

    AddRemoveFragment Frag_A = new AddRemoveFragment();
    transaction.add(R.id.fragment_container_1, Frag_A);
    transaction.addToBackStack(null);
    transaction.commit();
    

    在这种情况下,可以删除片段。

    更新 2:

    尝试在setOnClickListener 方法范围之外采取这一行:AddRemoveFragment Frag_A = new AddRemoveFragment();。我认为您的问题是您每次单击按钮时都会创建此片段的新实例。事实上,我会将这条线 FragmentManager fm1 = getSupportFragmentManager(); 移到外面,而且每次单击按钮时都不需要获取 SupportFragmentManager 的实例。你应该这样做一次。

    【讨论】:

    • 只是为了澄清。当您说add my fragment to the XML 时,您的意思是使用 FrameLayout 和一个 id 以便我可以处理它?另一种方法是我可以在没有像 FrameLayout 这样的容器的情况下使用 add()remove()
    • 我添加了 XML 布局。我没有在我的 XML 文件中使用片段,并且一开始没有显示任何内容。所以我可以同时使用addremove 对吗?就像你说的:You should .add() you fragment when you want to show it and .remove() it when you dont.
    • 没错,遵循这条规则应该对你有用,如果没有,那么你的其他逻辑有问题。
    • 尝试采用这一行:AddRemoveFragment Frag_A = new AddRemoveFragment();在 setOnClickListener 方法范围之外。我认为您的问题是您每次单击按钮时都会创建此片段的新实例。
    • 事实上我会移动这一行 FragmentManager fm1 = getSupportFragmentManager();外部也不需要在每次单击按钮时获取 SupportFragmentManager 的实例。你应该这样做一次。
    猜你喜欢
    • 2021-09-16
    • 1970-01-01
    • 2017-08-17
    • 1970-01-01
    • 1970-01-01
    • 2019-09-13
    • 2012-07-22
    • 2013-05-13
    • 2020-04-16
    相关资源
    最近更新 更多