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

Я хочу создать 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): на android.support.v4.app.BackStackRecord.replace(Неизвестный источник)
06-27 01: 45: 26.309: E/AndroidRuntime (8747): на android.support.v4.app.BackStackRecord.replace(Неизвестный источник)
06-27 01: 45: 26.309: E/AndroidRuntime (8747): at com.myapp.MainMenuFragment $MyButtonOnClickListener.onClick(MainMenuFragment.java:52)

Что я делаю неправильно?

Ответ 1

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

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

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

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

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

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

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

Ответ 2

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

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

Ответ 3

Другим вариантом является использование Android-WizardPager Романа Нурика.

Основные возможности:

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

Подробнее здесь.