Переключение между фрагментами в одном действии

Я хочу создать Activity который показывает своеобразное меню, которое пользователь может пройти. Нажав на элемент, отобразится новый экран, позволяющий пользователю получить больше опций (например, мастера).

Я хотел реализовать это с помощью Fragment s, но он не работает для меня.
Прямо сейчас у меня есть:

main.xml :

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" android:id="@+id/main_fragmentcontainer" > <fragment android:id="@+id/mainmenufragment" android:name="com.myapp.MainMenuFragment" android:layout_width="fill_parent" android:layout_height="fill_parent" /> <fragment android:id="@+id/secondmenufragment" android:name="com.myapp.SecondMenuFragment" android:layout_width="fill_parent" android:layout_height="fill_parent" /> </LinearLayout> 

MainMenuFragment с помощью OnClickListener :

 @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.mainmenu, container, false); setupButton(view); return view; } /* Button setup code omitted */ @Override public void onClick(View v) { SherlockFragment secondRunMenuFragment = (SherlockFragment) getSherlockActivity().getSupportFragmentManager().findFragmentById(R.id.secondmenufragment); FragmentTransaction transaction = getSherlockActivity().getSupportFragmentManager().beginTransaction(); transaction.replace(android.R.id.content, secondMenuFragment); //also crashes with R.id.main_fragmentcontainer transaction.addToBackStack(null); transaction.commit(); } 

Теперь, когда я нажимаю кнопку, приложение вылетает с этим логарифмом:

06-27 01: 45: 26.309: E / AndroidRuntime (8747): java.lang.IllegalStateException: невозможно изменить идентификатор контейнера фрагмента SecondMenuFragment {405e2a70 # 1 id = 0x7f060029}: было 2131099689 сейчас 2131099687
06-27 01: 45: 26.309: E / AndroidRuntime (8747): at android.support.v4.app.BackStackRecord.doAddOp (Неизвестный источник)
06-27 01: 45: 26.309: E / AndroidRuntime (8747): at android.support.v4.app.BackStackRecord.replace (Неизвестный источник)
06-27 01: 45: 26.309: E / AndroidRuntime (8747): at android.support.v4.app.BackStackRecord.replace (Неизвестный источник)
06-27 01: 45: 26.309: E / AndroidRuntime (8747): at com.myapp.MainMenuFragment $ MyButtonOnClickListener.onClick (MainMenuFragment.java:52)

Что я делаю не так?

Solutions Collecting From Web of "Переключение между фрагментами в одном действии"

Лично у меня не было бы никаких элементов <fragment> .

Шаг №1: <FrameLayout> свой макет деятельности с помощью <FrameLayout> для переменной части мастера, а также для разных кнопок.

Шаг №2: В onCreate() запустите FragmentTransaction чтобы загрузить первую страницу мастера в FrameLayout .

Шаг № 3: На следующем клике запустите FragmentTransaction чтобы заменить содержимое FrameLayout на следующую страницу мастера.

Шаг 4: добавьте в соответствующие смайлики для отключения кнопок, когда они непригодны (например, на первой странице мастера).

Кроме того, вам нужно подумать о том, как кнопка BACK должна работать в сочетании с любой экранной «задней» кнопкой в ​​мастере. Если вы хотите, чтобы они оба вели себя одинаково, вам нужно будет добавить каждую транзакцию в задний стек и поп-материал из заднего стека, когда вы будете обрабатывать кнопку «назад».

Когда-нибудь, если меня никто не ударит, я попытаюсь создать пример мастера из-за-фрагментов или, возможно, компонент многократного использования.

Я создаю этот основной макет:

 <LinearLayout 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:orientation="horizontal" tools:context="com.example.fragmentsexample.MainActivity" > <FrameLayout android:id="@+id/contentFragment" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_weight="1" /> </LinearLayout> 

И я пополнился в FrameActivity:

 @Override public void onCreate(Bundle savedInstanceState) { ... Fragment fragment = new Dashboard(); FragmentManager fm = getSupportFragmentManager(); FragmentTransaction transaction = fm.beginTransaction(); transaction.replace(R.id.contentFragment, fragment); transaction.commit(); ... } 

И я repleace on onClick Method с тем же кодом, cahnging Fragment (Dashboard for Events):

 @Override public void onClick.... { ... Fragment fragment = new Events(); FragmentManager fm = getSupportFragmentManager(); FragmentTransaction transaction = fm.beginTransaction(); transaction.replace(R.id.contentFragment, fragment); //Container -> R.id.contentFragment transaction.commit(); ... } 

Другой вариант – использовать Android-WizardPager от Roman Nurik.

Ключевая особенность:

  • Ветвление или способность шагов мастера влиять на доступность последующих шагов
  • Предоставление пользователю возможности просматривать до совершения
  • Разрешение пользовательской навигации произвольной формы между шагами мастера
  • Поддержка необходимых и необязательных шагов
  • Поддержка ступенчатых классов (технически каждый шаг представляет собой экземпляр класса Java, поэтому вы можете иметь несколько экземпляров в мастере)

Больше информации здесь.