如何在导航抽屉中维护片段的返回堆栈?

huangapple 未分类评论56阅读模式
标题翻译

How to maintain backstack of fragment in Navigation Drawer?

问题

我已经采取了一个活动,并在活动中附加了导航抽屉和主页片段。在那个导航抽屉中有一个“联系我们”的选项。当用户点击该选项时,会打开一个片段。但我无法维护该片段的堆栈。意味着当我在联系我们的片段上时,然后再次使用导航抽屉点击联系我们,它会覆盖之前的片段。我必须按两次返回按钮才能回到主页片段。请帮助我如何维护这个堆栈。以下是我的代码:

navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {
    @Override
    public boolean onNavigationItemSelected(@NonNull MenuItem item) {
        int id = item.getItemId();
        switch (id) {

            case R.id.rate:

                Uri uri = Uri.parse("market://details?id=" + getPackageName());
                Intent myAppLinkToMarket = new Intent(Intent.ACTION_VIEW, uri);
                try {
                    startActivity(myAppLinkToMarket);
                } catch (ActivityNotFoundException e) {
                    Toast.makeText(getApplicationContext(), "无法找到应用市场!", Toast.LENGTH_SHORT).show();
                }
                break;

           
            case R.id.contact_us:

                FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
                transaction.add(R.id.fragment_container_dashboard, ContactUsFragment.newInstance());
                transaction.addToBackStack(null);
                transaction.commit();
                mDrawerLayout.closeDrawer(GravityCompat.START);


                break;

        }
        return false;
    }
});

在这段代码后,我使用以下代码来维护堆栈:

@Override
public void onBackPressed() {
    if (getFragmentManager().getBackStackEntryCount() != 0) {
        getFragmentManager().popBackStack();
    }
    else new AlertDialog.Builder(this)
            .setMessage("确定要退出吗?")
            .setCancelable(false)
            .setPositiveButton("是的", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int id) {
                    Dashboard.super.onBackPressed();
                }
            })
            .setNegativeButton("取消", null)
            .show();
}

但问题是,每当我按下返回按钮时,它会在“联系我们”片段上显示退出对话框。但我想首先到达主页片段,然后如果我按下返回按钮,它才会显示退出对话框。

英文翻译

I have taken one activity and with activity I have attached navigation drawer and the home fragment. In that navigation drawer there is a option of "Contact Us". When user click on that option a fragment gets open. But I am not able to maintain the stack of that. means when I am on contact us fragment then using navigation drawer again click on contact us it overlaps previous one. I have to press back button 2 times to go on home fragment. Please Help me how to maintain back stack for this. Here is my code..

navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {
            @Override
            public boolean onNavigationItemSelected(@NonNull MenuItem item) {
                int id = item.getItemId();
                switch (id) {

                    case R.id.rate:

                        Uri uri = Uri.parse("market://details?id=" + getPackageName());
                        Intent myAppLinkToMarket = new Intent(Intent.ACTION_VIEW, uri);
                        try {
                            startActivity(myAppLinkToMarket);
                        } catch (ActivityNotFoundException e) {
                            Toast.makeText(getApplicationContext(), "Unable to find source market app!", Toast.LENGTH_SHORT).show();
                        }
                        break;

                   
                    case R.id.contact_us:

                        FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
                        transaction.add(R.id.fragment_container_dashboard, ContactUsFragment.newInstance());
                        transaction.addToBackStack(null);
                        transaction.commit();
                        mDrawerLayout.closeDrawer(GravityCompat.START);


                        break;

                }
                return false;
            }
        });

After this code I use this to maintain back stack:

@Override
    public void onBackPressed() {
        if (getFragmentManager().getBackStackEntryCount() != 0) {
            getFragmentManager().popBackStack();
        }
        
        else new AlertDialog.Builder(this)
                .setMessage("Are you sure you want to exit?")
                .setCancelable(false)
                .setPositiveButton("Yes", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int id) {
                        Dashboard.super.onBackPressed();
                    }
                })
                .setNegativeButton("No", null)
                .show();
    }

But the issue is It's show exit dialogue on contact us fragment when ever I press back button. But I want firstly I reach to home fragment and after that If I press back button then it show exit dialogue.

答案1

得分: 0

我通过在onCreate方法中添加以下内容解决了这个问题。

getSupportFragmentManager().addOnBackStackChangedListener(new FragmentManager.OnBackStackChangedListener() {
    @Override
    public void onBackStackChanged() {
        if(getSupportFragmentManager().getBackStackEntryCount() == 0){
            drawer.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED);
            menuToggle.setDrawerIndicatorEnabled(true);
            // your dialog
        }else{
            drawer.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED);
            menuToggle.setDrawerIndicatorEnabled(false);
            // remove to your previous fragment
        }
    }
});
英文翻译

I solved this by adding this in the onCreate method.

getSupportFragmentManager().addOnBackStackChangedListener(new FragmentManager.OnBackStackChangedListener() {
        @Override
        public void onBackStackChanged() {
            if(getSupportFragmentManager().getBackStackEntryCount() == 0){
                drawer.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED);
                menuToggle.setDrawerIndicatorEnabled(true);
                // your dialog
            }else{
                drawer.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED);
                menuToggle.setDrawerIndicatorEnabled(false);
                // remove to your previous fragment
            }
        }
    });

huangapple
  • 本文由 发表于 2020年3月16日 14:38:02
  • 转载请务必保留本文链接:https://java.coder-hub.com/60701368.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定