Android: как незаметно для пользователя перейти от одного фрагмента к другому?

У меня есть два фрагмента - А и Б - оба фрагмента занимают весь экран. Когда я загружаю свою активность, я показываю пользовательский фрагмент A, в то время как в фоновом режиме я загружаю фрагмент B (в менеджере фрагментов я заменяю фрагмент A, а затем добавляю и скрываю фрагмент B). Оба фрагмента имеют относительно похожие макеты (или, по крайней мере, было бы справедливо сказать, что макет A непосредственно перед переходом похож на начальный макет B — представления перемещаются), и когда я хочу перейти от A к B, я делаю «показать» на B и «скрыть» на A. Это почти идеально работает, но вы все еще можете видеть короткую вспышку белого между ними, прежде чем B будет показан, и это разрушает иллюзию того, что оба являются одним и тем же фрагментом. Как я могу перейти так, чтобы пользователь не заметил?

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

Вещи, которые я пробовал до сих пор:

• как я сказал выше, я пытался добавить B в фоновом режиме и делать «показ» на нем только тогда, когда это необходимо - чтобы сэкономить время на настройку

• Я пытался переопределить ожидающий переход и добавить затухание/затухание, но это не помогло.

• Я пытался скрыть фрагмент A вместо его удаления при отображении фрагмента B, но это не помогло.

• Я попытался переопределить ожидающий переход с помощью 0,0 (полностью избавиться от переходов), но все по-прежнему.

Код:

getSupportFragmentManager().beginTransaction()
            .replace(R.id.contentBlock, fragmentA, "FRAGMENTA")
            .add(R.id.contentBlock, fragmentB)
            .hide(fragmentB)
            .commit();

и позже:

getSupportFragmentManager().beginTransaction()
            .show(fragmentB)
            .remove(fragmentA)
            .commit();

person Jon    schedule 16.03.2016    source источник


Ответы (2)


Вы пытались установить TRANSIT_NONE для FragmentTransaction?

TRANSIT_NONE Нет анимации для перехода.

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

// Create new fragment and transaction
Fragment newFragment = new ExampleFragment();
FragmentTransaction transaction = getFragmentManager().beginTransaction();

// Replace whatever is in the fragment_container view with this fragment,
// and add the transaction to the back stack if needed
transaction.replace(R.id.fragment_container, newFragment);
transaction.setTransition(FragmentTransaction.TRANSIT_NONE);
transaction.addToBackStack(null);

// Commit the transaction
transaction.commit();

ПРИМЕЧАНИЕ. Фрагменты, которые жестко закодированы в XML, не могут быть заменены. (как указано здесь)

person Daniel Stanciu    schedule 18.03.2016
comment
Оба решения работают одинаково хорошо и предотвращают мерцание экрана, поэтому я бы честно дал им обоим лучший ответ. Однако, поскольку может быть только один, мне придется выбрать этот. - person Jon; 18.03.2016

mMapFragment = new MapFragment();

ft.beginTransaction(mMapFragment) .detach(getactivity) .attach(mMapFragment) .commit();

person user5466222    schedule 18.03.2016