2016-11-11 3 views
1

Я новичок в разработке и разработке приложений для Android, используя макет ящика Android по умолчанию.Назад к предыдущему фрагменту на onBackPressed в Android

Я использую фрагмент в приложении.

Я хочу вернуться к предыдущему фрагменту, когда на следующем фрагменте нажата кнопка «Назад». onBackPress должны выполнять следующие функции

  1. Вернитесь к предыдущему фрагменту, когда на следующем фрагменте
  2. Закрыть ящик, когда панель навигации открыта
  3. Выход приложения на двойной задней прессе, когда в fragment1

Это мой код в MainActivity при создании нового фрагмента

// replacing the fragment 
if (fragment != null) { 
    FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 
    ft.replace(R.id.content_frame, fragment); 
    ft.commit(); 
} 

onBackPress

@Override 
public void onBackPressed() { 
    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); 
    if (drawer.isDrawerOpen(GravityCompat.START)) { 
     drawer.closeDrawer(GravityCompat.START); 
    } else if (getFragmentManager().getBackStackEntryCount() > 0) { 
     FragmentManager fm = getSupportFragmentManager(); 
     fm.popBackStack(); 
    } else { 
     super.onBackPressed(); 
    } 
} 

Но это не работает, и при нажатии обратно выходит из приложения, за исключением, когда панель навигации открыта она закрыта.

ответ

1

Вы не добавляете фрагмент в заднюю часть. Вы просто должны сделать

FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 
.replace(R.id.content_frame, fragment); 
.addToBackStack(null); 
.commit(); 

А поскольку Backstack фактически обрабатывается кнопкой назад, вам не нужно обрабатывать этот сценарий в onBackPressed(), так что вы можете изменить его просто:

@Override 
public void onBackPressed() { 
    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); 
    if (drawer.isDrawerOpen(GravityCompat.START)) { 
     drawer.closeDrawer(GravityCompat.START); 
    } else { 
     super.onBackPressed(); 
    } 
} 
+0

добавление '.addToBackStack (null);' не работает.После добавления этой строки при первом нажатии кнопки «Назад» ничего не происходит, и при втором нажатии приложение выходит из –

0

Вы должны добавить Fragment в ваш FragmentTransaction к стопке.

FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 
    ft.replace(R.id.content_frame, fragment).addtoBackStack(null).commit(); 

Давая тег null все они получают сгруппированные по этой метке. Поэтому, если вам нужно закрыть их все вместе, вы можете сделать это или перейти к определенному.

Я также не использовал бы replace(), потому что это невероятно багги с задней стопой.

Попробуйте использовать remove(), а затем add().

0

Вы должны добавить фрагмент к задней стеке и изменить ваш код таким образом:

// this variable is needed to know how many times the back key has been pressed. 
// It is incremented and reset accordingly to the logic you described 
int mBackPressCount = 0; 

@Override 
public void onBackPressed() { 
    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); 
    if (drawer.isDrawerOpen(GravityCompat.START)) { 
     drawer.closeDrawer(GravityCompat.START); 
    } else { 
     if (getFragmentManager().getBackStackEntryCount() == 0) { 
      // if there are no fragments in your back stack check the mBackPressCount 
      if (mBackPressCount++ > 0) { 
       // if you pressed back for the second time this line will terminate the activity 
       super.onBackPressed(); 
      } 
     } else { 
      // this line will pop the fragment from the back stack, 
      // no need to pop it manually 
      super.onBackPressed(); 
     } 
    } 
} 

добавить фрагмент в задней стеку:

if (fragment != null) { 
    FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 
    ft.replace(R.id.content_frame, fragment); 
    ft.addToBackStack(null); 
    ft.commit(); 

    // when you add a fragment you should reset the back press count 
    mBackPressCount = 0; 
} 

Сброс mBackPressCount при открытии и закрытии выдвижного ящика. Если вы один раз нажали клавишу «Назад», и вы открываете ящик, счетчик должен быть снова установлен на 0.

DrawerLayout drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); 
drawerLayout.addDrawerListener(new DrawerLayout.DrawerListener() { 
    @Override 
    public void onDrawerSlide(View drawerView, float slideOffset) { 

    } 

    @Override 
    public void onDrawerOpened(View drawerView) { 
     mBackPressCount = 0; 
    } 

    @Override 
    public void onDrawerClosed(View drawerView) { 
     mBackPressCount = 0; 
    } 

    @Override 
    public void onDrawerStateChanged(int newState) { 

    } 
}); 
+0

, где нужно вставить третий сегмент кода? 'drawerLayout' является объектом' DrawerLayout'? –

+0

вы можете поместить его в метод onCreate. Изменен фрагмент. Однако я предлагаю использовать привязку данных, чтобы избежать всех этих вызовов findViewById (https://developer.android.com/topic/libraries/data-binding/index.html) – Massimo

+0

Я сделал то, что вы сказали, но на втором фрагменте принимает 3 раза назад, и ничего не происходит, и при нажатии на третью клавишу приложение выходит –