销毁全部片段后,空白活动显示

4

我创建了一个主活动,在其中设置了一个片段容器,我在导航菜单选项选择时替换了许多片段。它运行良好,但问题是:

  1. 当我两次点击导航项目时,会打开两个相同的片段,我必须按两次返回按钮才能返回。
  2. 当所有片段在按下后被销毁后,我看到了一个空白页面(可能是主活动页面)。

layout_main.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/main_activity_page"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/pageBackgroundColor"
    tools:context="co.sd.app.MainActivity">

    <RelativeLayout
        android:id="@+id/fragment_container"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

    <android.support.design.widget.NavigationView
        android:id="@+id/side_nav_drawer"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        android:padding="0sp"
        app:menu="@menu/side_navigation_menu" />

</android.support.v4.widget.DrawerLayout>

MainActivity.java

public class MainActivity extends AppCompatActivity {

    private Bundle bundle;
    private SessionManager session;
    private DrawerLayout drawerLayout;
    private ActionBarDrawerToggle actionBarToggle;
    private TextView cartItemCountDisplay;
    private NavigationView sideNavView;
    private Menu sideNavViewMenu;

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

        drawerLayout = (DrawerLayout) findViewById(R.id.main_activity_page);
        actionBarToggle = new ActionBarDrawerToggle(this, drawerLayout, R.string.OPEN, R.string.CLOSE);

        drawerLayout.addDrawerListener(actionBarToggle);
        actionBarToggle.syncState();

        getSupportActionBar().setDisplayHomeAsUpEnabled(true);

        bundle = new Bundle();

        sideNavView = ((NavigationView) findViewById(R.id.side_nav_drawer));
        sideNavViewMenu = sideNavView.getMenu();

        //To Display Home Fragment On Page Load
        displaySelectedItemResult(sideNavViewMenu.findItem(R.id.nav_home));

        //To Adjust Login or Logout option in side navigation menu
        if (session.isUserLoggedIn()) {
            sideNavViewMenu.findItem(R.id.nav_login).setVisible(false);
            sideNavViewMenu.findItem(R.id.nav_logout).setVisible(true);
        } else {
            sideNavViewMenu.findItem(R.id.nav_login).setVisible(true);
            sideNavViewMenu.findItem(R.id.nav_logout).setVisible(false);
        }

        //Operation on side navigation item click
        sideNavView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {
            @Override
            public boolean onNavigationItemSelected(MenuItem item) {
                displaySelectedItemResult(item);
                //navDrawerLayout.closeDrawers();
                return true;
            }
        });
    }

    private void displaySelectedItemResult(MenuItem item) {
        sideNavViewMenu.findItem(R.id.nav_home).setChecked(false);
        sideNavViewMenu.findItem(R.id.nav_contactUs).setChecked(false);
        sideNavViewMenu.findItem(R.id.nav_aboutUs).setChecked(false);
        sideNavViewMenu.findItem(R.id.nav_login).setChecked(false);
        sideNavViewMenu.findItem(R.id.nav_logout).setChecked(false);

        Fragment fragment;

        switch (item.getItemId()) {
            case R.id.nav_user:
                if (session.isUserLoggedIn()) {
                    item.setTitle(session.getUserDetails().get(SessionManager.KEY_NAME));
                } else {
                    item.setTitle("Login First!");
                }
                drawerLayout.closeDrawer(GravityCompat.START);
                break;
            case R.id.nav_home:
                fragment = new HomeFragment();
                if (fragment != null) {
                    callNavMenuItemsFragment(fragment, "FRAG_HOME");
                }
                item.setChecked(true);
                drawerLayout.closeDrawer(GravityCompat.START);
                break;
            case R.id.nav_contactUs:
                fragment = new ContactUsFragment();
                if (fragment != null) {
                    callNavMenuItemsFragment(fragment, "FRAG_CONTACT_US");
                }
                item.setChecked(true);
                drawerLayout.closeDrawer(GravityCompat.START);
                break;
            case R.id.nav_aboutUs:
                fragment = new AboutUsFragment();
                if (fragment != null) {
                    callNavMenuItemsFragment(fragment, "FRAG_ABOUT_US");
                }
                item.setChecked(true);
                drawerLayout.closeDrawer(GravityCompat.START);
                break;
            case R.id.nav_login:
                new UserAuthentication(MainActivity.this, session).loginAndSignupDialog();
                sideNavViewMenu.findItem(R.id.nav_login).setVisible(false);
                sideNavViewMenu.findItem(R.id.nav_logout).setVisible(true);
                item.setChecked(true);
                drawerLayout.closeDrawer(GravityCompat.START);
                break;
            case R.id.nav_logout:
                session.logoutUser();
                sideNavViewMenu.findItem(R.id.nav_login).setVisible(true);
                sideNavViewMenu.findItem(R.id.nav_logout).setVisible(false);
                item.setChecked(true);
                drawerLayout.closeDrawer(GravityCompat.START);
                break;

            default:

        }
    }

    private FragmentTransaction callNavMenuItemsFragment(final Fragment fragment, final String fragmentTag) {
        FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
        ft.addToBackStack(null);
        //if (!ACTIVE_FRAGMENT_ID.equals(String.valueOf(fragment.getId()))) {
        if (!activeFragmentIDsList.contains(String.valueOf(fragment.getId()))) {
            ft.replace(R.id.fragment_container, fragment, fragmentTag);
            activeFragmentIDsList.add(String.valueOf(fragment.getId()));
        }
        ft.commit();
        return ft;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        if (actionBarToggle.onOptionsItemSelected(item)) {
            return true;
        }
        switch (item.getItemId()) {
            case android.R.id.home:
                finish();
                break;
            case R.id.cart:
                if (session.isUserLoggedIn()) {
                    startActivity(new Intent(MainActivity.this, CartActivity.class));
                } else if (new UserAuthentication(MainActivity.this, session).loginAndSignupDialog()) {
                    startActivity(new Intent(MainActivity.this, CartActivity.class));
                }
                break;

            default:
        }
        return super.onOptionsItemSelected(item);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.actionbar_menu, menu);

        final MenuItem menuItem = menu.findItem(R.id.cart);
        MenuItemCompat.setActionView(menuItem, R.layout.cart_badge_layout);
        final View actionView = MenuItemCompat.getActionView(menuItem);
        cartItemCountDisplay = actionView.findViewById(R.id.cart_badge);

        setupBadge();

        actionView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                setupBadge();
                onOptionsItemSelected(menuItem);
            }
        });
        return super.onCreateOptionsMenu(menu);
    }

    private void setupBadge() {
        int itemCount = (((AppGlobalContent) getApplicationContext()).getSelectedItemsCount());
        if (cartItemCountDisplay != null) {
            if (itemCount == 0) {
                if (cartItemCountDisplay.getVisibility() != View.GONE) {
                    cartItemCountDisplay.setVisibility(View.GONE);
                }
            } else {
                cartItemCountDisplay.setText(String.valueOf(Math.min(itemCount, 99)));
                if (cartItemCountDisplay.getVisibility() != View.VISIBLE) {
                    cartItemCountDisplay.setVisibility(View.VISIBLE);
                }
            }
        }
    }

    @Override
    public void onBackPressed() {
        if (drawerLayout.isDrawerOpen(GravityCompat.START)) {
            drawerLayout.closeDrawer(GravityCompat.START);
        } else {
            super.onBackPressed();
        }
    }
}

请在这个问题上给我建议。
1个回答

5
这将解决您的第二个问题,当您向容器中添加片段时,它们将被添加到堆栈中。
if (getSupportFragmentManager().getBackStackEntryCount() == 1) {
            finish();
        }
        else {
            super.onBackPressed();
        }

当堆栈条目数为1时,您必须完成该活动。

对于第一个问题,您必须在再次添加相同的片段时使用“弹出后退栈”: getSupportFragmentManager().popBackStack();


太好了!对我有用,谢谢 :) - Shamim Ahmad
如果有帮助到你,我很高兴! :) - Praneeth
FragmentManager fm = getSupportFragmentManager();fm.popBackStack();FragmentTransaction ft = fm.beginTransaction();ft.replace(R.id.fragment_container, fragment, fragmentTag);ft.commit(); - Shamim Ahmad
当您从导航菜单点击相同片段时,请使用getSupportFragmentManager().popBackStack();在菜单项的onClick事件中,这将确保当您尝试再次将相同的片段添加到堆栈中时,它会删除现有的片段。 - Praneeth
工作正常 :), 它只维护堆栈中的一个活动,并在按下 BackPress 时终止。 - Shamim Ahmad
谢谢你,你救了我的一天。 - Shamim Ahmad

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