Ответ 1
Теория
Используйте addToBackStack(tag:String):FragmentTransaction
метод из FragmentTransaction
, чтобы отметить точку, в которую вы хотите вернуться. Этот метод возвращает экземпляр FragmentTransaction
только для возможности цепочки.
Затем вернитесь с помощью метода popBackStackImmediate(tag:String,flag:int):void
из FragmentManager
. Тег - это то, что вы указали ранее. Флагом является либо константа POP_BACK_STACK_INCLUSIVE
, чтобы включить отмеченную транзакцию, либо 0
.
Пример
Далее следует пример со следующим макетом, имеющим FrameLayout
с id content_frame
, где загружаются фрагменты.
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/hello_world" />
<FrameLayout
android:id="@+id/content_frame"
android:layout_below="@id/textView"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</RelativeLayout>
Приведенный ниже код маркирует фрагмент с помощью этого имени класса фрагмента при замене содержимого элемента макета id content_frame
.
public void loadFragment(final Fragment fragment) {
// create a transaction for transition here
final FragmentTransaction transaction = getSupportFragmentManager()
.beginTransaction();
// put the fragment in place
transaction.replace(R.id.content_frame, fragment);
// this is the part that will cause a fragment to be added to backstack,
// this way we can return to it at any time using this tag
transaction.addToBackStack(fragment.getClass().getName());
transaction.commit();
}
И для завершения этого примера рассмотрим метод, позволяющий вернуться к тому же самому фрагменту с помощью тега при его загрузке.
public void backToFragment(final Fragment fragment) {
// go back to something that was added to the backstack
getSupportFragmentManager().popBackStackImmediate(
fragment.getClass().getName(), 0);
// use 0 or the below constant as flag parameter
// FragmentManager.POP_BACK_STACK_INCLUSIVE);
}
При реализации этого для реального вам может потребоваться добавить нулевую проверку параметра фрагмента; -).