Подтвердить что ты не робот

Как вернуться к предыдущему фрагменту при нажатии кнопки возврата вручную отдельного фрагмента?

В моем приложении есть только один 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 и т.д.

Как реализовать этот тип функциональности?

4b9b3361

Ответ 1

public void onBackPressed()
{
    FragmentManager fm = getActivity().getSupportFragmentManager();
    fm.popBackStack();
}

Ответ 2

Я реализовал аналогичный сценарий только сейчас.

Действие "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

Ответ 3

@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();
    }
}

Этот код проще, потому что он имеет меньше логики и полагается на структуру, чем на наш пользовательский код. К сожалению, мне не удалось реализовать код для первой ситуации, поскольку мне это не нужно.

Ответ 4

Вы должны реализовать свою собственную реализацию backstack, как описано здесь.

Вы можете вызвать popFragments() всякий раз, когда вы нажимаете кнопку "Назад" в фрагменте и вызываете pushFragments() всякий раз, когда вы перемещаетесь от одного фрагмента к другому.

Ответ 5

Просто сделай

getActivity().getFragmentManager().popBackStack();

Ответ 6

Попробуйте это, его работа для меня.

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);

        }
    }
}

Ответ 7

Обратная кнопка будет перемещаться в порядке, в котором фрагменты были добавлены в стопку. Это предоставляется как функция навигации по умолчанию. Теперь, если вы хотите перейти к определенному фрагменту, вы можете показать его из-под стопки.

Ответ 8

Вы можете обработать его, добавив тег в backStack. Проверьте мой ответ здесь:

fooobar.com/questions/25325/...

надеюсь, что это поможет

Ответ 9

@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;
        }
    });
}

//Счастливое кодирование

Ответ 10

Если вы нажмете назад изображение, вам сначала необходимо создать метод

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();

                }
            });

Это отлично работает для меня.