如何在按钮点击时添加/删除Fragment?

7

目前我有一个“RELATIVE_LAYOUT”容器,我正在使用它来添加我的片段。 我在按钮上使用 OnClickListener 将片段 XML 布局加载到 RelativeLayout 容器中。

我想要实现的是,当我按一次按钮时,片段应该加载...当我再次按下它时,片段应该被移除。我已经尝试使用整数来识别片段是否已加载,但失败了。 任何帮助都受到赞赏...

代码:

public class MainActivity extends Activity {
    Button B1,B2;
    int boolb1=0, boolb2=0;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        B1 = (Button)findViewById(R.id.btn1);
        B2 = (Button)findViewById(R.id.btn2);

        B1.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                FragmentManager fm = getFragmentManager();
                FragmentTransaction ft = fm.beginTransaction();
                FragmentOne f1 = new FragmentOne();

                if(boolb1==0)
                {ft.add(R.id.frg1, f1);
                ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
                boolb1=1;}
                else
                {ft.remove(f1);
                ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_CLOSE);
                boolb1=0;}
                //ft.addToBackStack("f1");
                ft.commit();
            }
        });

        B2.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                FragmentManager fm = getFragmentManager();
                FragmentTransaction ft = fm.beginTransaction();
                FragmentTwo f2 = new FragmentTwo();

                if(boolb2==0) {
                   ft.add(R.id.frg2, f2);
                   ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
                   boolb2=1;
                } else {
                   ft.remove(f2);
                   ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_CLOSE);
                   boolb2=0;
                }

                //ft.addToBackStack("f2");
                ft.commit();
            }
        });
    }
1个回答

14

你的问题在于每次点击按钮时都会创建一个新的Fragment。你需要获取到当前添加的Fragment的引用,然后将其删除。

此外,您不再需要使用标记。在添加Fragment时,您可以给它打上标记。在删除Fragment时,您可以使用添加Fragment时使用的标记来获取对当前已添加的Fragment的引用。

以下是如何实现的示例:

private Button B1;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    B1 = (Button)findViewById(R.id.btn1);

    B1.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            FragmentManager fm = getFragmentManager();
            FragmentTransaction ft = fm.beginTransaction();
            FragmentOne f = (FragmentOne) fm.findFragmentByTag("tag");

            if(f == null) {  // not added
                f = new FragmentOne();
                ft.add(R.id.frg1, f, "tag");
                ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);

            } else {  // already added

                ft.remove(f);
                ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_CLOSE);
            }

            ft.commit();
        }
    });

    // and so on ...
}

是的,我只想补充一下更好的方法是完全删除“added”变量,只需通过片段管理器中的片段呈现来决定...在这种情况下,在屏幕旋转后恢复状态时需要做的工作较少。 - Billda
非常好的答案...不过有一个疑问,当我第一次按下按钮时,Java会创建一个FragmentOne f1对象,并将findFragmentByTag返回的值传递给它,但是标签“tag”尚未与任何片段关联,因为我们是在if块中执行的。那么,这不应该会生成错误吗? - Abhi9
不,那不应该生成错误,FragmentOne f 将为 null 并且分支 if(f == null) 将被执行.. - Billda
好的...所以最初存储在f1中的值将为null,因为tag未与任何片段相关联...对吧 - Abhi9

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接