Android 谷歌导航抽屉,处理回压设置正确的检查

Android 谷歌导航抽屉,处理回压设置正确的检查,android,android-fragments,navigation-drawer,onbackpressed,Android,Android Fragments,Navigation Drawer,Onbackpressed,目前使用的谷歌导航抽屉,在用户按下时出现一些问题 当用户反按时,他们不会更新菜单项 我单击应用程序时的示例。顺序是A>B>C>B>C,如果我按反键,我想成为C>B>A。我应该如何编写这种方式 我的代码 public class MainActivity extends AppCompatActivity { private String appTitle; private Toolbar toolbar; private NavigationView navigatio

目前使用的谷歌导航抽屉,在用户按下时出现一些问题

  • 当用户反按时,他们不会更新菜单项
  • 我单击应用程序时的示例。顺序是A>B>C>B>C,如果我按反键,我想成为C>B>A。我应该如何编写这种方式
  • 我的代码

    public class MainActivity extends AppCompatActivity {
    
        private String appTitle;
        private Toolbar toolbar;
        private NavigationView navigationView;
        private DrawerLayout drawerLayout;
        private TextView toolbarTitle;
        private Fragment fragment;
        private FragmentManager fragmentManager;
        private Title title;
        private MenuItem menuItem2;
    
    
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            //Actionbar
            toolbar = (Toolbar) findViewById(R.id.toolbar);
            setSupportActionBar(toolbar);
            toolbarTitle = (TextView) toolbar.findViewById(R.id.toolbar_title);
            toolbarTitle.setTextColor(Color.parseColor("#FFFFFF"));
            setTitle("");
    
            fragmentManager = getSupportFragmentManager();
            fragment= new HomeFragment();
            title = new Title(getApplicationContext());
            fragmentManager.beginTransaction().replace(R.id.content_frame,fragment , title.getStrHome()).commit();
    
            navigationView = (NavigationView) findViewById(R.id.navigation_view);
            navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {
                @Override
                public boolean onNavigationItemSelected(MenuItem menuItem) {
                    menuItem2 = menuItem;
    
                   menuItem.setChecked(true);
                    drawerLayout.closeDrawers();
    
                    if (menuItem.getItemId() == R.id.nav_home) {
                        fragment = new HomeFragment();
                        appTitle = title.getStrHome();
                    }  else if ((menuItem.getItemId() == R.id.nav_direction)) {
                        fragment = new DirectionFragment();
                        appTitle = title.getStrDirection();
                    } else if ((menuItem.getItemId() == R.id.nav_more)) {
                        fragment = new MoreFragment();
                        appTitle = title.getStrMore();
                    } else if((menuItem.getItemId()==R.id.nav_directory)){
                        fragment = new DirectoryFragment();
                        appTitle = title.getStrDirectory();
                    }
                    else {
                        Toast.makeText(getApplicationContext(), "Error", Toast.LENGTH_SHORT).show();
                    }
                    replaceFragment(fragment,appTitle);
    
                    return true;
                }
            });
    
            drawerLayout = (DrawerLayout) findViewById(R.id.drawer);
            ActionBarDrawerToggle actionBarDrawerToggle =
         new ActionBarDrawerToggle
             (this,drawerLayout,toolbar,R.string.drawer_open,R.string.drawer_close){
                @Override
                public void onDrawerClosed(View drawerView) {
                    super.onDrawerClosed(drawerView);
                }
    
                @Override
                public void onDrawerOpened(View drawerView) {
                    super.onDrawerOpened(drawerView);
                }
            };
    
    
            drawerLayout.setDrawerListener(actionBarDrawerToggle);
            actionBarDrawerToggle.syncState();
    
        }
    
    
    
        public void onBackPressed() {
            if(drawerLayout.isDrawerOpen(GravityCompat.START)){
                drawerLayout.closeDrawer(GravityCompat.START);
            }
            else {
                if (fragmentManager.getBackStackEntryCount() > 0 ){
                    fragmentManager.popBackStack();
                    toolbarTitle.setText(appTitle);
                    menuItem2.setChecked(true);
    
    
                } else {
                    finish();
                }
            }
    
        }
        public void replaceFragment(Fragment fragment, String tag){
            toolbarTitle.setText(tag);
            FragmentTransaction ft =  fragmentManager.beginTransaction().replace(R.id.content_frame, fragment, tag);
            ft.addToBackStack(tag);
    
            ft.commit();
        }
    
    
        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            // Inflate the menu; this adds items to the action bar if it is present.
            getMenuInflater().inflate(R.menu.menu_main, menu);
            return true;
        }
    
        @Override
        public boolean onOptionsItemSelected(MenuItem item) {
            int id = item.getItemId();
            if (id == R.id.action_settings) {
                return true;
            }
    
            return super.onOptionsItemSelected(item);
        }
    
    
    
    
    }
    

    正如Android官方页面上所述,您可以看到如何使用意图标志中的
    标志\u ACTIVITY\u CLEAR\u TOP
    来实现所需的行为。这张照片很好地说明了这一点

    您的常规后退按钮如下所示:

    当您指定此标志时,您将获得所需的行为


    编辑:

    官方文件指出:

    FLAG\u ACTIVITY\u CLEAR\u TOP

    如果正在启动的活动已在当前任务中运行,则所有 除此之外的其他活动将被销毁

    这意味着,您的不同活动将不会重复,并且您将拥有一个干净的后台堆栈


    在您的示例中,
    A>B>C>B>C
    是不可能的。相反,它将是
    A>B>C
    ,因为BC已经存在于堆栈中,所以不会添加它们,但取而代之。

    正如Android官方页面上所述,您可以看到如何使用意图标志中的
    标志\u活动\u清除\u顶部
    来实现所需的行为。这张照片很好地说明了这一点

    您的常规后退按钮如下所示:

    当您指定此标志时,您将获得所需的行为


    编辑:

    官方文件指出:

    FLAG\u ACTIVITY\u CLEAR\u TOP

    如果正在启动的活动已在当前任务中运行,则所有 除此之外的其他活动将被销毁

    这意味着,您的不同活动将不会重复,并且您将拥有一个干净的后台堆栈


    在您的示例中,
    A>B>C>B>C
    是不可能的。相反,它将是
    A>B>C
    ,因为BC已经存在于堆栈中,它们不会被添加,而是被替换。

    研究Android活动启动模式

    是否有明确的解释。
    看看吧

    研究Android活动启动模式

    是否有明确的解释。
    看看吧

    对不起,我仍然不能真正理解它的意思。对不起,我仍然不能真正理解它的意思。