再次单击项目时如何删除片段

时间:2017-04-06 06:23:51

标签: android fragment

美好的一天,

我正面临片段问题

当用户点击“更多”时,我正在显示片段,作为弹出菜单

enter image description here

但是当我再次单击“更多”时,就像在前一个上添加一个片段

当我再次点击“更多”时,有人可以告诉我如何删除片段吗?谢谢!

enter image description here

底部导航菜单的java代码

public class MainActivity extends AppCompatActivity {

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

    BottomNavigationView bottomNavigationView = (BottomNavigationView)
            findViewById(R.id.bottom_navigation);
    BottomNavigationViewHelper.disableShiftMode(bottomNavigationView);

    bottomNavigationView.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() {
        @Override
        public boolean onNavigationItemSelected(@NonNull MenuItem item) {
            Fragment fragment = null;
            String title = "";
            switch (item.getItemId()) {
                case R.id.menu:
                    getFragmentManager().beginTransaction().replace(R.id.fragment_container, new MenuFragment()).addToBackStack(null).commit();
                    title = "MENU";
                    getSupportActionBar().setTitle(title);
                    break;
                case R.id.promotion:
                    getFragmentManager().beginTransaction().replace(R.id.fragment_container, new PromotionFragment()).addToBackStack(null).commit();
                    title = "PROMOTION";
                    getSupportActionBar().setTitle(title);
                    break;
                case R.id.order:
                    getFragmentManager().beginTransaction().replace(R.id.fragment_container, new OrderFragment()).addToBackStack(null).commit();
                    title = "ORDER";
                    getSupportActionBar().setTitle(title);
                    break;
                case R.id.location:
                    getFragmentManager().beginTransaction().replace(R.id.fragment_container, new LocationFragment()).addToBackStack(null).commit();
                    title = "LOCATION";
                    getSupportActionBar().setTitle(title);
                    break;
                case R.id.more:
                    getFragmentManager().beginTransaction().add(R.id.fragment_container, new MoreFragment()).addToBackStack(null).commit();

                    break;
            }
            return true;
        }});

}

}

4 个答案:

答案 0 :(得分:0)

转换为新版时,请勿将弹出式Fragment添加到backstack。这是你应该做的第一步。

接下来,而不是在第二个"更多"重新打开Popup。点击,你应该关闭它。听起来更好的方法。但是使用Dialogs.

可能会更好

答案 1 :(得分:0)

要做到这一点,你必须跟踪片段状态。让我们假设一个变量isFragmentOpen。在onClick中,您必须翻转变量并做出决定。

private boolean isFragmentOpen;

void onClick(View view) {

    if (!isFragmentOpen) {
        addFragment();
    } else {
        removeFragment();
    }
    // Flip the fragment state.
    isFragmentOpen = !isFragmentOpen;

}

请检查如何在官方文档Fragments

中添加或删除片段

答案 2 :(得分:0)

在为'more'调用事务之前,使用addToBackStack函数添加标记(例如:moreFragment)。检查片段管理器并删除片段,如:

 Fragment mFragment =getSupportFragmentManager().findFragmentByTag("moreFragment");
 if(mFragment != null)
     getSupportFragmentManager().beginTransaction().remove(mFragment);

但我认为不是删除旧片段而是保留它,如果不为空则不要打开新片段

答案 3 :(得分:0)

感谢您的帮助,现在我已经解决了问题^^

这是我使用的代码

FragmentManager fm = getFragmentManager();
                    FragmentTransaction ft = fm.beginTransaction();
                    MoreFragment f = (MoreFragment) fm.findFragmentByTag("tag");

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

                    } else {  // already added

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