Intereting Posts
Пауза / Возобновление MediaCodec Откройте мою программу для Android после обновления Может ли MQTT использоваться для реализации поведения Request / Response Проблема с памятью при обработке и обработке нескольких больших растровых изображений Максимальный выходной ток от USB-смартфонов Ошибка: не удалось запустить SDK-инструмент mksdcard Как найти скорость, используя только акселерометры? Espresso: Как использовать ресурсы R.string в папке androidTest Просмотр иерархии монитора Android Debug не отображается Получение ширины и высоты изображения с помощью библиотеки picasso InputStream из папки Assets на Android возвращается пустым Android Canvas.drawTextOnPath не выглядит корректным, если для параметра Paint установлено значение Stroke Почему пиксельные цвета не корректны в OpenGL ES 2.0 на Android? Проблема фильтра Google Play: это приложение доступно для более чем 0 устройств Как я могу получить и сохранить данные на SD-карте на всех устройствах Android?

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

Я хочу создать 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)

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

Лично у меня не было бы никаких элементов <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, поэтому вы можете иметь несколько экземпляров в мастере)

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