FloatingActionButton setVisibility () не работает

Я не могу скрыть свой FloatingActionButton. Вот мой код:

XML:

<CoordinatorLayout>

    <AppBarLayout android:id="@+id/appbar">

        <CollapsingToolbarLayout>

            <ImageView/>

            <android.support.v7.widget.Toolbar />

        </CollapsingToolbarLayout>

    </AppBarLayout>

    <NestedScrollView />

    <android.support.design.widget.FloatingActionButton
        android:id="@+id/fab"
        app:layout_anchor="@id/appbar"
        app:layout_anchorGravity="bottom|right|end"/>

</CoordinatorLayout>

И я звоню:

fab.clearAnimation();
fab.setVisibility(View.GONE);

Я пытаюсь скрыть FAB, но кажется, что setVisibility + clearAnimation не работает, если FAB находится в CoordinatorLayout.

Даже если я вызову fab.clearAnimation, анимация все равно запустится. Может кто-нибудь помочь мне?


person user2331095    schedule 25.06.2015    source источник
comment
@Clairvoyant потрясающий FloatingActionButton..   -  person user2331095    schedule 25.06.2015
comment
попробуйте добавить fab.invalidate() в setVisibility. Или переключите clearAnimation и setVisibility.   -  person Danielson    schedule 25.06.2015
comment
Вы используете @+id, так как hardartcore отредактировал ваш вопрос   -  person Pankaj    schedule 25.06.2015
comment
@Clairvoyant Я просто забыл добавить @+id/fab в xml в своем вопросе   -  person user2331095    schedule 25.06.2015
comment
Я думаю, вам следует обратиться к: stackoverflow.com/questions/16087913/   -  person CodeMonster    schedule 25.06.2015


Ответы (6)


Если ваша проблема связана с анимацией, вы можете попробовать аннулировать файл FAB Behavior. Что касается видимости, вы должны обнулить якорь, который вы установили в своем макете:

CoordinatorLayout.LayoutParams p = (CoordinatorLayout.LayoutParams) fab.getLayoutParams();
p.setBehavior(null); //should disable default animations
p.setAnchorId(View.NO_ID); //should let you set visibility
fab.setLayoutParams(p);
fab.setVisibility(View.GONE); // View.INVISIBLE might also be worth trying


//to bring things back to normal state
CoordinatorLayout.LayoutParams p = (CoordinatorLayout.LayoutParams) fab.getLayoutParams();
p.setBehavior(new FloatingActionButton.Behavior());
p.setAnchorId(R.id.appbar);
fab.setLayoutParams(p);
person natario    schedule 25.06.2015
comment
Работает ли это для вас? Я пробовал, но это не работает... FAB все еще виден, и анимация все еще срабатывает... - person user2331095; 25.06.2015
comment
Что запускает анимацию? Вы имеете в виду, что вызов setVisibility(GONE) запускает анимацию, или это просто обходной путь, который вы пытались избежать анимации? - person natario; 25.06.2015
comment
Отредактировал мой ответ, чтобы также удалить атрибут anchor. - person natario; 25.06.2015
comment
Анимация FAB может показывать/закрывать при прокрутке. На самом деле мне плевать на анимацию. Я хочу установить видимость FAB программно. - person user2331095; 25.06.2015
comment
И все равно ничего не произойдет, если использовать первые четыре строчки моего кода? - person natario; 25.06.2015
comment
Первые четыре строки отключают некоторые функции, которые могут позволить вам скрыть () FAB. Последние четыре строчки просто возвращают вещи в нормальное состояние — не стоит их использовать, если они вам не нужны. Попробуйте использовать только предыдущий раздел. - person natario; 25.06.2015
comment
Я пробовал, результат таков, что FAB только в левом верхнем углу, его все равно видно, но анимация пропала. - person user2331095; 25.06.2015
comment
Я сталкивался с подобным поведением в прошлом. Кажется, что CoordinatorLayout не доволен настройкой видимости. Вы можете попробовать View.INVISIBLE вместо View.GONE , но я не уверен, что это сработает. - person natario; 25.06.2015
comment
Ты прав. После тестирования я обнаружил, что он fab.setVisibility работает только при установке для anchorId значения null. Я думаю, вам лучше добавить fab.setVisibility к вашему ответу. - person user2331095; 25.06.2015
comment
Я столкнулся с той же проблемой, и ваш ответ исправил ее. благодарю вас - person Hisham Bakr; 06.10.2015

Используйте методы show и hide, чтобы показать и скрыть плавающую кнопку действия.

FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);

// To show the Floating Action Button
fab.show();

// To hide the Floating Action Button
fab.hide();
person Hemant Aggarwal    schedule 13.12.2018
comment
В отличие от fab.setVisibility(), fab.show() и fab.hide() вызывают анимацию. Поэтому, если, например, вы хотите начать новую активность после того, как скрыли fab, вы должны использовать fab.addOnHideAnimationListener(animatorListener) и начать следующую активность с обратного вызова onAnimationEnd() аниматораListener. NB: вы должны позвонить fab.addOnHideAnimationListener() прежде чем позвонить fab.hide(). Если вы не выполните эти шаги, вы можете не получить плавную анимацию скрытия. - person ban-geoengineering; 30.05.2019

Для FloatingActionButton метод setVisibility() выдаст ошибку при сборке с последними Gradle 6.x и build-tool 28.x.x и больше не рекомендуется. Вместо этого используйте:

fab.hide()    // fab.setVisibility(View.GONE)
fab.show()    // fab.setVisibility(View.VISIBLE)

Примечание. Успешно протестировано на Android Studio 3.4.1, Gradle 6.0 и build-tool 28.0.1.

person Rahul Raina    schedule 30.05.2019
comment
Вместо создания нового (но очень похожего) ответа может быть более уместно добавить эту информацию в качестве комментария к ответу mstoic: stackoverflow. com/a/53770108/1617737 - person ban-geoengineering; 30.05.2019
comment
В дополнение к нему я также добавил причину, по которой setVisibility() не работает. - person Rahul Raina; 30.05.2019
comment
Да, я знаю. :-) Но я думаю, что было бы более уместно добавить эту информацию в виде комментариев, так как ваш код (фактическое решение) идентичен его. - person ban-geoengineering; 31.05.2019

Я столкнулся с точно такой же проблемой. Похоже, что команда Google Android не хочет, чтобы вы контролировали видимость, когда FloatingActionButton привязан к AppBarLayout, как обсуждалось в этом выпуске — FloatingActionButton игнорирует видимость просмотра

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

<android.support.design.widget.FrameLayout
    android:id="@+id/fab_container"
    android:layout_height="wrap_content"
    android:layout_width="wrap_content"
    android:visibility="invisible">

    <android.support.design.widget.FloatingActionButton
        android:id="@+id/fab"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/fab_icon"/>

</android.support.design.widget.FrameLayout>

Однако вы можете подумать, является ли это идеальным поведением. Сторонники Google рекомендуют, чтобы FAB отображался сразу после создания экрана. Если вы скрываете его дольше, чем требуется для его анимации, рассмотрите вместо этого отображение отключенного состояния.

person AlgoRyan    schedule 27.10.2015

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

fab.setEnabled(false);
fab.setClickable(false);
fab.setAlpha(0.3f);
person Dan Alboteanu    schedule 28.09.2018

FloatingActionButton layers = (FloatingActionButton) findViewById(R.id.layers);
layers.hide();

Это работает для меня, setVisibility не работает для FloatingActionButton, так как принадлежит другому viewGroup, у которого нет метода setVisibility.

person Satendra Behre    schedule 22.11.2018