Android Назад к первому фрагменту в навигационном устройстве

У меня есть приложение, которое имеет несколько фрагментов в NavigationDrawer.

Ниже мой код:

@Override public boolean onPrepareOptionsMenu(Menu menu) { // if nav drawer is opened, hide the action items boolean drawerOpen = mDrawerLayout.isDrawerOpen(mDrawerList); menu.findItem(R.id.action_search).setVisible(!drawerOpen); return super.onPrepareOptionsMenu(menu); } /** * Diplaying fragment view for selected nav drawer list item * */ private void displayView(int position) { // update the main content by replacing fragments fragment = null; switch (position) { case 0: fragment = new HomeFragment(); break; case 1: fragment = new GalleryFragment(); break; case 2: fragment = new ContactFragment(); break; default: break; } if (fragment != null) { FragmentManager fragmentManager = getFragmentManager(); fragmentManager.beginTransaction() .replace(R.id.frame_container, fragment).commit(); // update selected item and title, then close the drawer mDrawerList.setItemChecked(position, true); mDrawerList.setSelection(position); setTitle(navMenuTitles[position]); mDrawerLayout.closeDrawer(mDrawerList); } else { // error in creating fragment Log.e("MainActivity", "Error in creating fragment"); } } @Override public void setTitle(CharSequence title) { mTitle = title; getActionBar().setTitle(mTitle); } /** * When using the ActionBarDrawerToggle, you must call it during * onPostCreate() and onConfigurationChanged()... */ @Override protected void onPostCreate(Bundle savedInstanceState) { super.onPostCreate(savedInstanceState); // Sync the toggle state after onRestoreInstanceState has occurred. mDrawerToggle.syncState(); } @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); // Pass any configuration change to the drawer toggls mDrawerToggle.onConfigurationChanged(newConfig); } @Override public void onBackPressed() { if (fragment != null) { FragmentManager fragmentManager = getFragmentManager(); fragmentManager.beginTransaction() .add(R.id.frame_container, fragment).commit(); int position = 0; fragment = new HomeFragment(); // update selected item and title, then close the drawer mDrawerList.setItemChecked(position, true); mDrawerList.setSelection(position); setTitle(navMenuTitles[position]); mDrawerLayout.closeDrawer(mDrawerList); } else { // error in creating fragment Log.e("MainActivity", "Error in creating fragment"); } } 

Что это в основном делает, сначала идет HomeFragment, когда я хочу перейти к другому fragment MediaFragment и решить вернуться назад, нажав кнопку «Назад», я хочу перейти в HomeFragment, и когда я хочу закрыть приложение, снова нажав кнопку «Назад», он будет Теперь отклоняйте приложение так же, как приложение gmail. Как я могу это достичь? У меня возникла проблема с использованием кода, который я ввел в свой onBackPressed() . Всякий раз, когда я иду на другие фрагменты, HomeFragment – это тот, который показывает. Есть идеи? Ваша помощь будет принята с благодарностью.

ОБНОВЛЕНИЕ : До того, как я был в MediaFragment и нажал кнопку «Назад», он автоматически закрывает приложение. Это не должно быть, но он должен пойти в HomeFragment , и когда он находится в HomeFragment и я HomeFragment кнопку «Назад», он закроет приложение.

Вместо того, чтобы дублировать ваш код в onBackPressed, почему бы не просто отслеживать выбранную последнюю позицию?

 int selectedPosition = 0; private void displayView(int position) { ... // All your current code selectedPosition = position; } @Override public void onBackPressed() { if (selectedPosition != 0) { displayView(0); } else { super.onBackPressed(); } 

Почему бы просто не добавить фрагмент в backstack, когда вы совершаете транзакцию, как сказал @Raghunandan. См. Ниже код,

  if (fragment != null) { FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction() .replace(R.id.frame_container, fragment).commit(); //Changed from fragmentManager to FragmentTrasaction fragmentTransaction.addToBackStack(null); //this will add the fragment to backstack and hence pressing back will take to previous trasaction // update selected item and title, then close the drawer mDrawerList.setItemChecked(position, true); mDrawerList.setSelection(position); setTitle(navMenuTitles[position]); mDrawerLayout.closeDrawer(mDrawerList); } else { // error in creating fragment Log.e("MainActivity", "Error in creating fragment"); } 

Не добавляйте HomeFragment else, когда вы нажимаете назад, перед тем, как выйти из приложения, вы увидите пустую страницу (или что-то в этом роде) (вы должны снова нажать ее, чтобы не добавлять HomeFragment). Добавьте весь фрагмент отдельно от него в backstack, и вы сможете продолжить, как хотите. Кроме того, когда вы загружаете Activity из фрагмента, он автоматически поддерживается приложением в backstack, поэтому не нужно беспокоиться об этом.

Дайте мне знать, как это происходит по вашему требованию.