Как да накарам FAB да избегне преместването във ViewPager, но да бъде част от фрагмента вътре?

Заден план

Съгласно указанията за материален дизайн (тук), ако използвате ViewPager, който има FAB (плаващ бутон за действие) за фрагментите вътре, FAB не трябва да се движи като част от фрагментите, но или изчезва, или се заменя с друг, или се оживява към нещо друго.

Накратко, вместо това:

https://material-design.storage.googleapis.com/publish/material_v_4/material_ext_publish/0B6Okdz75tqQsNVRkV3FZMktvMWc/components-buttons-fab-behavior_06_xhdpi_009.webm

трябва да направите това:

https://material-design.storage.googleapis.com/publish/material_v_4/material_ext_publish/0B6Okdz75tqQsVlhxNGJCNTEzNFU/components-buttons-fab-behavior_04_xhdpi_009.webm

Проблемът

Не виждам никакъв пример или урок за това кой е най-добрият начин за изпълнение на това.

Имам предвид наличието на FAB за всеки фрагмент (или някои от тях) във ViewPager, докато всеки ще бъде контролиран от своя фрагмент (логика и как изглежда), но FAB наистина няма да се движи като част от фрагмента, докато се плъзга между фрагментите във ViewPager.

Дори като примерни приложения, не виждам това поведение никъде. Приложението за контакти има един и същ FAB и за двата фрагмента, а FAB за набиране просто се движи.

Има дори приложения, които използват лошото поведение (като Solid-Explorer). В YouTube има FAB (на фрагмента „Акаунт“), но е в заглавката, така че може да е добре там.

Въпроса

Как трябва да приложите правилното поведение? Наистина ли бихте поставили FAB като част от дейността вместо фрагментите?

Има ли може би урок и/или пример за това?

Може би, когато ViewPager започне да превърта, бих могъл да отделя FAB и да го прикача към дейността, да анимирам, докато се превърта, и когато приключи с превъртането, мога да го скрия и да покажа този на другия фрагмент?


person android developer    schedule 03.08.2015    source източник
comment
FAB трябва да бъде част от фрагмента, а не от дейността. Що се отнася до анимацията, мисля, че PageTransform трябва да го направи   -  person Blackbelt    schedule 03.08.2015


Отговори (1)


Сблъсках се със същия проблем с viewpager и fab преди малко и го реших по следния начин:

  • Прикрепете fab към дейността над визуализатора
  • Добавете OnPageChangeListener към ViewPager и запазете позицията на onPageSelected(int position) в глобална променлива във вашата дейност
  • В onPageSelected стартирайте anim на вашия fab (може да бъде xml или програмно, аз го направих с xml) и променете неговия colorTint
  • В onClick(View v) на вашия OnClickListener, когато извличате fab id (или изглед) на вашия fab, за да определите кое действие трябва да извършите, можете да създадете израз за превключване с позицията, която получавате преди в onPageSelected

РЕДАКТИРАНЕ

Това са моите два anim.xml, които се опитах да създам подобно на насоките за Android:

Анимация, за да изчезне старата фантазия:

<?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>
person Giorgio Antonioli    schedule 03.08.2015
comment
Чудя се обаче, можете ли да избегнете поставянето на FAB в дейността? - person android developer; 03.08.2015
comment
@androiddeveloper да, можете също да го поставите във фрагмент, който съдържа viewpager (който съдържа други фрагменти). Но поставянето на FAB във всеки фрагмент от viewpager означава, че имате множество FAB и не мисля, че е добър начин да го приложите. Все още можете да изчакате други отговори за добро внедряване. - person Giorgio Antonioli; 03.08.2015
comment
Имах предвид фрагментите в viewPager, но разбирам какво имате предвид. Вие казвате това, което си помислих, че вероятно е невъзможно и че контейнерът на ViewPager трябва да обработва FAB по един или друг начин. - person android developer; 03.08.2015
comment
@androiddeveloper да, мисля, че контейнерът трябва да съдържа както viewpager, така и fab - person Giorgio Antonioli; 03.08.2015