销毁所有碎片后显示空白活动

Sha*_*mad 4 android android-layout android-fragments

我创建了一个主要活动,其中有一个片段容器,我在导航菜单选项选择中替换其中的许多片段。它工作正常,但问题是:

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

布局_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>
Run Code Online (Sandbox Code Playgroud)

主活动.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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

请给我建议。

Pra*_*eth 5

这将解决您的第二个问题,当您将片段添加到容器时,它们将被添加到堆栈中,

if (getSupportFragmentManager().getBackStackEntryCount() == 1) {
            finish();
        }
        else {
            super.onBackPressed();
        }
Run Code Online (Sandbox Code Playgroud)

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

对于第一个问题,您必须使用“pop back stack”,同时再次添加相同的片段使用: getSupportFragmentManager().popBackStack();