3

我的布局中有一个带有 Button 和 FrameLayout 的 Activity。当我单击按钮时,我将片段添加到 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()。从参考资料中,我不了解更具体的内容。只是说它从容器中删除了片段。这不是我想要的吗?从FrameLayout中移除片段?

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

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);to更改为transaction.remove(Frag_A);但仍然具有相同的功能。

4

1 回答 1

3

对于fragment,首先你需要记住一件事:如果你在你的xml布局中添加了你的fragment,那么它是不能被移除的,它只能用方法显示,用.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:

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

于 2013-05-18T20:49:20.483 回答