【问题标题】:Remove fragment from activity when clicking button?单击按钮时从活动中删除片段?
【发布时间】:2020-01-27 06:15:20
【问题描述】:

目前,我的主要活动有一个描述字段,当用户单击描述时会打开一个片段。在片段上有一个文本字段和一个按钮,当我单击按钮时,我想关闭片段并返回我的活动。

我怎样才能做到这一点?

我在片段中添加了一个 onClickListener 来捕获按钮的点击。 toast 消息被打印,但片段没有被删除/关闭。

descDismiss.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Toast.makeText(getContext(), "Dismissed", Toast.LENGTH_LONG).show();

                getActivity().getFragmentManager().popBackStackImmediate();
            }
        });

我在片段的 onCreateView 中有 onClickListener。这是正确的吗?

提前致谢!

编辑:

我正在像这样添加我的片段:

((MainActivity)context).getSupportFragmentManager().beginTransaction()
                        .add(R.id.fragment_container, frag).commit();

【问题讨论】:

  • 您确定您使用的是正确的片段和片段管理器类(不支持一种或另一种方式)?
  • Fragment 在 Activity 中,所以请说明“返回到您的 Activity”。
  • 你在使用 AppCompactActivity 吗?然后使用 getSupportFragmentManager
  • @Shaishav 你是对的,我应该使用支持片段管理器,我已经进行了更改,但它仍然不起作用。
  • @cricket_007 我有一个 MainActivity,它的布局带有一堆文本视图和按钮,当用户单击某个按钮时,会在所有内容之上添加一个片段。现在这个片段有一个关闭按钮,我想关闭片段并返回到我的 MainActivity 布局,这有帮助吗?

标签: android android-layout android-fragments


【解决方案1】:

先试试这个,像这样将片段添加到 backstack

FragmentManager fragmentManager = getFragmentManager();
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
    fragmentTransaction.replace(..............);
    fragmentTransaction.addToBackStack(null);
    fragmentTransaction.commit(); 

然后像这样删除片段:-

FragmentManager fm = getActivity().getSupportFragmentManager();
      if(fm.getBackStackEntryCount()>0) {
      fm.popBackStack();
}

删除所有碎片

FragmentManager fm = getActivity().getSupportFragmentManager();
      for (int i = 0; i < fm.getBackStackEntryCount(); ++i) {
      fm.popBackStack();
}

【讨论】:

  • 谢谢!我认为我的问题是我没有正确地将片段添加到后台堆栈。之后改变 popBackStack 工作。
【解决方案2】:

试试这个

getActivity().getSupportFragmentManager().popBackStack();

【讨论】:

  • 我已经尝试过了,不幸的是它没有删除片段。请参阅我编辑的帖子,了解我是如何添加片段的,也许我没有正确地做那部分?
【解决方案3】:

使用getFragmentManager().popBackStack();

【讨论】:

    【解决方案4】:

    尝试使用以下代码:

       public void fragmentReplace() {
                if (getSupportFragmentManager().findFragmentByTag(new TermsAndConditionFragment().getClass().getName()) != null) {
                    getSupportFragmentManager().popBackStack(new TermsAndConditionFragment().getClass().getName(),
                            FragmentManager.POP_BACK_STACK_INCLUSIVE);
                }  else {
                    super.onBackPressed();
                }
    

    在 descDismiss 按钮 clickListener 的 main Activity 中插入以下代码:

     descDismiss.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    Toast.makeText(getContext(), "Dismissed", Toast.LENGTH_LONG).show();
                    fragmentReplace();
    
                }
            });
    

    【讨论】:

      【解决方案5】:

      我添加片段的方式:

      fragmentTransaction = fragmentManager.beginTransaction();
      frmInicio fragment = new frmInicio();
      fragmentTransaction.add(R.id.content_menu_layout, fragment,"frm_inicio");
      fragmentTransaction.commit();
      

      我的删除方式

      //frm_inicio
      Fragment frm = fragmentManager.findFragmentByTag("frm_inicio");
      if(frm!=null){
          fragmentTransaction = fragmentManager.beginTransaction();
          fragmentTransaction.remove(frm);
          fragmentTransaction.commit();
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-12-26
        • 1970-01-01
        • 1970-01-01
        • 2014-08-22
        • 2013-06-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多