Ответ 1
public void onBackPressed()
{
FragmentManager fm = getActivity().getSupportFragmentManager();
fm.popBackStack();
}
В моем приложении есть только один activity
и несколько fragments
.
Два основных фрагмента A (слева) и B (справа).
Fragment A1 called from A
B1 called from B
B2 called from B1
Все fragments
имеют отдельные кнопки обратной связи.
Итак, когда я нажимаю кнопку fragment
A1, она должна вернуться к A, аналогично, когда кнопка "Назад" от B2 нажата, B1 и от B1 до B и т.д.
Как реализовать этот тип функциональности?
public void onBackPressed()
{
FragmentManager fm = getActivity().getSupportFragmentManager();
fm.popBackStack();
}
Я реализовал аналогичный сценарий только сейчас.
Действие "A" → Вызывает фрагмент "A1" и нажимает на элемент меню, он вызывает фрагмент "A2", и если пользователь нажимает кнопку "A2", это возвращается к "A1" , и если после этого пользователь нажимает "A1" после этого, он завершает действие "A" и возвращается.
См. следующий код:
Действие 'A' - метод OnCreate():
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activityA);
if (savedInstanceState == null) {
Fragment fragInstance;
//Calling the Fragment newInstance Static method
fragInstance = FragmentA1.newInstance();
getFragmentManager().beginTransaction()
.add(R.id.container, fragInstance)
.commit();
}
}
Фрагмент: 'A1'
Я заменяю существующий фрагмент новым фрагментом, когда происходит действие щелчка элемента меню:
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == R.id.action_edit_columns) {
//Open the Fragment A2 and add this to backstack
Fragment fragment = FragmentA2.newInstance();
this.getFragmentManager().beginTransaction()
.replace(R.id.container, fragment)
.addToBackStack(null)
.commit();
return true;
}
return super.onOptionsItemSelected(item);
}
Действие "A" - onBackPressed():
Поскольку все фрагменты имеют одну родительскую активность (которая есть "A" ), метод onBackPressed() позволяет вам вырезать фрагменты, если они есть, или просто вернуться к предыдущему действию.
@Override
public void onBackPressed() {
if(getFragmentManager().getBackStackEntryCount() == 0) {
super.onBackPressed();
}
else {
getFragmentManager().popBackStack();
}
}
Если вы ищете фрагменты внутри фрагментов, перейдите по ссылке: http://developer.android.com/about/versions/android-4.2.html#NestedFragments
@trueblue ответ заставил меня пойти с одной незначительной, но раздражающей проблемой. Когда на задней стороне есть только один фрагмент, и вы нажимаете кнопку "Назад" , этот кадр удаляется, и приложение остается активным с пустым экраном. Чтобы выйти из приложения, пользователю необходимо снова нажать кнопку "Назад" . Я изменил исходный код следующим образом, чтобы справиться с этой ситуацией.
@Override
public void onBackPressed() {
if(getFragmentManager().getBackStackEntryCount() == 0) {
super.onBackPressed();
}
else if(getFragmentManager().getBackStackEntryCount() == 1) {
moveTaskToBack(false);
}
else {
getFragmentManager().popBackStack();
}
}
Когда в стопке только 1 фрагмент, мы в основном говорим android, чтобы переместить все приложение обратно.
Итак, после более подробного ознакомления с этим, я обнаружил, что вы можете добавлять транзакции диспетчера фрагментов в задний стек, а затем андроид обращается к нажатию автоматически и по желанию. В приведенном ниже фрагменте кода показано, как это сделать
Fragment fragment; //Create and instance of your fragment class here
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.fragment_container, fragment).addToBackStack(null);
fragmentTransaction.commit();
fragmentTransaction.addToBackStack(null);
В последней строке показано, как добавить транзакцию в задний стек. Это решает проблему с прессой для фрагментов в большинстве ситуаций, кроме одного. Если вы нажмете кнопку "Назад" , то в итоге вы достигнете точки, когда в заднем стеке будет только один фрагмент. На этом этапе вы захотите сделать одну из двух вещей
В моем случае это было позже, поэтому я изменил переопределенный метод onBackPressed
из моего предыдущего ответа, чтобы выглядеть ниже
@Override
public void onBackPressed() {
if(getFragmentManager().getBackStackEntryCount() == 1) {
moveTaskToBack(false);
}
else {
super.onBackPressed();
}
}
Этот код проще, потому что он имеет меньше логики и полагается на структуру, чем на наш пользовательский код. К сожалению, мне не удалось реализовать код для первой ситуации, поскольку мне это не нужно.
Вы должны реализовать свою собственную реализацию backstack, как описано здесь.
Вы можете вызвать popFragments()
всякий раз, когда вы нажимаете кнопку "Назад" в фрагменте и вызываете pushFragments()
всякий раз, когда вы перемещаетесь от одного фрагмента к другому.
Просто сделай
getActivity().getFragmentManager().popBackStack();
Попробуйте это, его работа для меня.
public void onBackPressed() {
if (mainLayout.isMenuShown()) {
mainLayout.toggleMenu();
} else {
FragmentManager fm = getSupportFragmentManager();
Log.print("back stack entry", fm.getBackStackEntryCount() + "");
if (fm.getBackStackEntryCount() > 1) {
fm.popBackStack();
// super.onBackPressed();
// return;
} else {
if (doubleBackToExitPressedOnce) {
fm.popBackStack();
super.onBackPressed();
return;
}
this.doubleBackToExitPressedOnce = true;
Toast.makeText(this, "Press one more time to exit",
Toast.LENGTH_SHORT).show();
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
doubleBackToExitPressedOnce = false;
}
}, 3000);
}
}
}
Обратная кнопка будет перемещаться в порядке, в котором фрагменты были добавлены в стопку. Это предоставляется как функция навигации по умолчанию. Теперь, если вы хотите перейти к определенному фрагменту, вы можете показать его из-под стопки.
Вы можете обработать его, добавив тег в backStack
. Проверьте мой ответ здесь:
fooobar.com/questions/25325/...
надеюсь, что это поможет
@Override
public void onResume() {
super.onResume();
getView().setFocusableInTouchMode(true);
getView().requestFocus();
getView().setOnKeyListener(new View.OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
if (event.getAction() == KeyEvent.ACTION_UP && keyCode == KeyEvent.KEYCODE_BACK){
// replace your fragment here
return true;
}
return false;
}
});
}
//Счастливое кодирование
Если вы нажмете назад изображение, вам сначала необходимо создать метод
private void Backpresses() {
getActivity().getSupportFragmentManager().beginTransaction().replace(R.id.contant_main, new Home()).commit();
}
тогда вы должны вызвать это, когда вы нажмете назад изображение.
back.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Backpresses();
}
});
Это отлично работает для меня.