如何在按钮单击时添加/删除片段?

Posted

技术标签:

【中文标题】如何在按钮单击时添加/删除片段?【英文标题】:How to add/remove Fragment on Button click? 【发布时间】:2014-08-22 10:33:47 【问题描述】:

目前我有一个“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】:

您的问题是每次单击Button 时都会创建一个新的 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 ...

【讨论】:

是的,我只想补充一点,更好的方法是完全删除“添加”变量,并通过在片段管理器中显示片段来决定..在这种情况下,您在旋转后恢复状态的工作将减少屏幕 优秀的答案......虽然有一个疑问,当我第一次按下按钮时,java创建了一个FragmentOne f1的对象并将findFragmentByTag返回的值传递给它,但标签“tag”不是与任何片段相关联,因为我们在 if 块中执行此操作。那么,这不应该产生错误吗??? 不,这不应该产生错误,FragmentOne f 将为 null 并且分支 if(f == null) 将被执行.. 好的...所以最初存储在 f1 中的值将为空,因为标签与任何片段都没有关联...对

以上是关于如何在按钮单击时添加/删除片段?的主要内容,如果未能解决你的问题,请参考以下文章

用户单击删除按钮时如何获取当前(添加)按钮

如何在主片段中单击按钮时打开导航抽屉?

如何在 FAB 按钮单击时将数据从多个片段发送到单个活动

Android:单击片段中的按钮时如何通知活动? [复制]

如何通过单击适配器类中代码的项目中的删除按钮来删除列表视图中的项目后重新加载片段?

单击 CursorAdapter 中的按钮时如何在列表视图项目行中执行更新和删除操作