Как заставить FAB не перемещаться в ViewPager, но быть частью фрагмента внутри?

Задний план

В соответствии с рекомендациями по материальному дизайну ( здесь ), если вы используете ViewPager, у которого есть FAB (кнопка с плавающим действием) для фрагментов внутри, FAB не должен перемещаться как часть фрагментов, но либо исчезает, либо заменяется другим , Или оживить что-то еще.

Короче говоря, вместо этого:

Вы должны сделать это:

Проблема

Я не вижу ни одного примера или учебника о том, как лучше всего это выполнить.

Я имею в виду, что FAB для каждого фрагмента (или некоторых из них) в ViewPager, в то время как каждый из них будет контролироваться его фрагментом (логикой и тем, как он выглядит), но FAB не будет действительно перемещаться как часть фрагмента при сдвиге Между фрагментами в ViewPager.

Даже в качестве примеров приложений я не вижу такого поведения нигде. Приложение для контактов имеет тот же FAB для обоих фрагментов, и у дозвона есть только FAB.

Есть даже приложения, которые используют плохое поведение (например, Solid-Explorer). На YouTube есть FAB (в фрагменте «Учетная запись»), но он находится в заголовке, так что, возможно, все в порядке.

Вопрос

Как следует реализовать правильное поведение? Вы действительно положили бы FAB как часть активности вместо фрагментов?

Может быть, учебник и / или образец об этом?

Может быть, когда ViewPager начнет прокрутку, я могу отсоединить FAB и прикрепить его к активности, оживить во время прокрутки, и когда это будет прокрутка, я могу скрыть его и показать один из другого фрагмента?

Solutions Collecting From Web of "Как заставить FAB не перемещаться в ViewPager, но быть частью фрагмента внутри?"

Я столкнулся с такой же проблемой с viewpager и fab немного времени назад, и я решил таким образом:

  • Прикрепите fab к активности над viewpager
  • Добавьте OnPageChangeListener в ViewPager и сохраните onPageSelected(int position) в глобальной переменной в вашей деятельности
  • В onPageSelected запустите onPageSelected вашего fab (она может быть как xml, так и программно, я сделал это с xml) и изменил его colorTint
  • В вашем OnClickListener onClick(View v) когда вы извлекаете файл (или представление) вашего fab, чтобы определить, какое действие вы должны выполнить, вы можете создать оператор switch с положением, которое вы получите до этого в onPageSelected

РЕДАКТИРОВАТЬ

Это мои два файла anim.xml, которые я пытался создать схожими с рекомендациями для Android:

Анимировать, чтобы исчезнуть старый fab:

 <?xml version="1.0" encoding="utf-8"?> <set android:shareInterpolator="false" xmlns:android="http://schemas.android.com/apk/res/android"> <scale android:interpolator="@android:anim/accelerate_decelerate_interpolator" android:fromXScale="1.0" android:toXScale="0.0" android:fromYScale="1.0" android:toYScale="0.0" android:pivotX="50%" android:pivotY="50%" android:fillAfter="false" android:duration="200" /> <rotate android:duration="200" android:interpolator="@android:anim/linear_interpolator" android:pivotX="50%" android:pivotY="50%" android:fromDegrees="360" android:toDegrees="270" /> </set> 

Анимация, чтобы показать новую:

 <?xml version="1.0" encoding="utf-8"?> <set android:shareInterpolator="false" xmlns:android="http://schemas.android.com/apk/res/android"> <scale android:interpolator="@android:anim/accelerate_decelerate_interpolator" android:fromXScale="0.0" android:toXScale="1.0" android:fromYScale="0.0" android:toYScale="1.0" android:pivotX="50%" android:pivotY="50%" android:fillAfter="false" android:duration="200" /> <rotate android:duration="200" android:interpolator="@android:anim/linear_interpolator" android:pivotX="50%" android:pivotY="50%" android:fromDegrees="270" android:toDegrees="360" /> </set>