кнопка плавающего действия минифаба во фрагменте не активна - PullRequest
0 голосов
/ 30 августа 2018

У меня есть плавающая кнопка действия внутри фрагмента с 3 другими минифабами, которые оживляют его по дуге. Основной FAB работает просто отлично и вызывает анимацию на мини-фабах, но мини-фабы по какой-то причине не активируются. Я могу легко получить доступ ко всем Фабам, но не могу получить доступ к setOnClickListener() мини-фабам. Вот макет:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout 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"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:orientation="vertical"
    android:fitsSystemWindows="true">

    <TextView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="center_vertical|center_horizontal"
        android:text="@string/chatter"
        android:textColor="@color/black" />

    <android.support.design.widget.FloatingActionButton
        android:id="@+id/fab_chatter_video"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginBottom="@dimen/fab_first_menu_item_margin_bottom"
        android:layout_marginEnd="@dimen/right_margin"
        android:clickable="true"
        android:focusable="true"
        android:visibility="visible"
        app:backgroundTint="@color/white"
        app:fabSize="mini"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:srcCompat="@drawable/ic_chatter_new_video"
        android:fitsSystemWindows="true" />

    <android.support.design.widget.FloatingActionButton
        android:id="@+id/fab_chatter_open"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginBottom="@dimen/fab_bottom_margin"
        android:layout_marginEnd="@dimen/fab_main_right_margin"
        android:clickable="true"
        android:focusable="true"
        android:visibility="visible"
        app:backgroundTint="@color/colorPrimary"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:fabSize="normal"
        app:srcCompat="@drawable/ic_chatter_new" />

    <android.support.design.widget.FloatingActionButton
        android:id="@+id/fab_chatter_photo"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginBottom="@dimen/fab_first_menu_item_margin_bottom"
        android:layout_marginEnd="@dimen/right_margin"
        android:clickable="true"
        android:focusable="true"
        android:visibility="visible"
        app:backgroundTint="@color/white"
        app:fabSize="mini"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:srcCompat="@drawable/ic_chatter_new_photo" />

    <android.support.design.widget.FloatingActionButton
        android:id="@+id/fab_chatter_text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginBottom="@dimen/fab_first_menu_item_margin_bottom"
        android:layout_marginEnd="@dimen/right_margin"
        android:clickable="true"
        android:focusable="true"
        android:visibility="visible"
        app:backgroundTint="@color/white"
        app:fabSize="mini"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:srcCompat="@drawable/ic_chatter_new_text" />

    <LinearLayout
        android:id="@+id/main_chatter_overlay"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:alpha="0.45"
        android:orientation="vertical"
        android:visibility="invisible"
        android:background="@color/mainColor"
        />

</android.support.constraint.ConstraintLayout>

Я оживляю fab_chatter_open этим кодом, который работает просто отлично. Нажав анимацию и все:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:fillAfter="true" >
    <rotate android:fromDegrees="45"
        android:toDegrees="0"
        android:pivotX="50%"
        android:pivotY="50%"
        android:duration="300"
        android:interpolator="@android:anim/linear_interpolator"/>
</set>

и изменение этой анимации при повторном нажатии FAB.

Тогда я анимирую мини-фабы с помощью этого кода. Анимация на miniFabs работает просто отлично, но FABs никак не активируются:

<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:interpolator="@android:anim/linear_interpolator"
    android:fillAfter="true" >

    <translate android:fromXDelta="82%p" android:toXDelta="65%p"
        android:fromYDelta="7%p" android:toYDelta="7%p"
        android:duration = "100"/>
    <alpha android:fromAlpha="0"
        android:toAlpha="1"
        android:interpolator="@android:anim/accelerate_interpolator"
        android:duration="100"/>
</set>

Вы также заметите Linearlayout внизу. Это сделано для того, чтобы переосмыслить recyclerView с коэффициентом 50%, чтобы сосредоточиться на потрясающих материалах и уменьшить яркость контента. К сожалению, он не охватывает панель действий или нижнюю навигацию, как я бы предпочел. Если у вас есть предложения для достижения этой цели, пожалуйста, дайте мне знать.

1 Ответ

0 голосов
/ 30 августа 2018

По-видимому, в ограниченном макете, когда вы анимируете плавающую кнопку действия с помощью translate, нажатие кнопки остается там, где FAB был первоначально нарисован, когда представление было создано и надуто. Вместо этого я решил использовать нижнюю и нижнюю границу полей для кнопок с плавающим действием miniFabs:

android:layout_marginBottom=""
android:layout_marginEnd=""

, чтобы разместить плавающие кнопки на экране, где я хотел, когда вид изначально рисуется и раздувается относительно основного FAB. Кроме того, поскольку это ограниченный макет, я использовал:

app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent"

, чтобы поместить кнопки в нижний правый угол, где расположен основной FAB, в противном случае было бы намного сложнее рассчитать поля margin-bottom и margin-top этих мини-фабрик.

Затем я использую анимацию alpha и анимацию scale на мини-фабриках. Это сохраняет мини-фабы в одном и том же месте для событий щелчка, но дает им некоторую анимацию, поэтому они имеют немного чутья.

Я также удостоверился, что для свойства isEnabled() каждого FAB задано значение false, как только я установил, что их видимость пропала, в противном случае событие click все равно будет там.

...