Подтвердить что ты не робот

Сделать FAB ответ на отображение/скрытие изменений в Soft Keyboard

Я видел различные сообщения о том, что FAB реагируют на всплывающие окна Snackbar в нижней части экрана, а также с помощью scroll-чувствительных FAB. Но существует ли какая-либо реализация FloatingActionButton.Behavior (или аналогичного) для перемещения FAB над клавиатурой, когда она появляется?

Прямо сейчас клавиатура закрывает FAB, когда я нажимаю, например, в поле EditText. Моя цель - оживить FAB, чтобы он всегда был виден независимо от состояния клавиатуры.

EDIT: Оба android:windowSoftInputMode="adjustResize" и ...="adjustPan" ничего не изменят. Ну, adjustResize изменяет размер основного макета (который в моем случае является картой), но FAB не перемещается.

4b9b3361

Ответ 1

Привет, я знаю это старый, но для будущих или текущих читателей/искателей, а также создателя потоков, он еще не нашел ответа. Вот как у меня такое поведение в моем приложении.

Fab скрывается в прокрутке RecyclerView, поднимается, когда появляется снек-бар, если fab не отображается, а snackbar popus вверх, и если вы прокручиваете, то все же Fab будет отображаться в верхней части снэк-бара и будет двигаться вниз, когда SB исчезнет и продолжит клавиатура, если она откроет Fab, будет выдвинута вверх. (извините, мне пришлось писать coz, я не знаю, как дать gif с эмулятором eclipse)

Изображение

введите описание изображения здесь

Разметка

<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/layout_drawer"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/GrayGood"
android:clipToPadding="false"
android:fitsSystemWindows="true" >

<android.support.design.widget.CoordinatorLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/layout_coordinator"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <android.support.design.widget.AppBarLayout
        android:id="@+id/layout_appLayout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:theme="@style/ThemeOverlay.AppCompat.Dark" >

        <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            app:layout_scrollFlags="scroll|enterAlways|snap"
            android:background="?attr/colorPrimary" />
    </android.support.design.widget.AppBarLayout>

    <android.support.v7.widget.RecyclerView
        android:id="@+id/recyclerViewMain"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_behavior="@string/appbar_scrolling_view_behavior"
        android:clipToPadding="false" />

    <android.support.design.widget.FloatingActionButton
        android:id="@+id/fab"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_gravity="bottom|end"
        android:layout_margin="@dimen/floating_action_button_margin"
        app:layout_behavior="com.faisal.cvcd.anim.ScrollingFABAnimation"
        android:src="@drawable/ic_fab"
        android:tint="@color/White"
        app:backgroundTint="@color/colorPrimary"
        app:borderWidth="0dp"
        app:elevation="6dp"
        app:fabSize="normal" />
 </android.support.design.widget.CoordinatorLayout>
</android.support.v4.widget.DrawerLayout>

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

ScrollingFABAnimation

import android.content.Context;
import android.support.design.widget.CoordinatorLayout;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v4.view.ViewCompat;
import android.util.AttributeSet;
import android.view.View;

public class ScrollingFABAnimation extends
        CoordinatorLayout.Behavior<FloatingActionButton> {

public ScrollingFABAnimation(Context context, AttributeSet attrs) {
    super(context, attrs);
}

//For SnackBar to push up the Floating Button when it pops up
@Override
public boolean layoutDependsOn(CoordinatorLayout parent,    FloatingActionButton child, View dependency) {
    return dependency instanceof Snackbar.SnackbarLayout;
}

@Override
public boolean onDependentViewChanged(CoordinatorLayout parent, FloatingActionButton child, View dependency) {
    float translationY = Math.min(0, dependency.getTranslationY() - dependency.getHeight());
    child.setTranslationY(translationY);
    return true;
}

//For FAB to hide or show on scroll
@Override
public boolean onStartNestedScroll(CoordinatorLayout coordinatorLayout, FloatingActionButton child, View directTargetChild, View target,
        int nestedScrollAxes) {
    return nestedScrollAxes == ViewCompat.SCROLL_AXIS_VERTICAL  || super.onStartNestedScroll(coordinatorLayout, child,
                    directTargetChild, target, nestedScrollAxes);
}

@Override
public void onNestedScroll(CoordinatorLayout coordinatorLayout, FloatingActionButton child, View target, int dxConsumed,
        int dyConsumed, int dxUnconsumed, int dyUnconsumed) {
    super.onNestedScroll(coordinatorLayout, child, target, dxConsumed,  dyConsumed, dxUnconsumed, dyUnconsumed);

    if (dyConsumed > 0 && child.getVisibility() == View.VISIBLE) {
        child.hide();
    } else if (dyConsumed < 0 && child.getVisibility() != View.VISIBLE) {
        child.show();
    }
 }
}

Ответ 2

У меня была та же проблема, я попытался добавить ScrollView внутри моего корневого представления, но это не сработало, потому что содержимое не превышает высоту отображения (в этом случае реакция на реакцию соответствует ожидаемому).

Итак, я попробовал android:windowSoftInputMode="adjustResize", и он работает для меня.

Для получения информации о том, как выглядит мой макет xml:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <ManyViewsExceptScrollViews/>

    <android.support.design.widget.FloatingActionButton
        [..]
        android:layout_alignParentBottom="true"
        android:layout_alignParentRight="true"
        android:layout_alignParentEnd="true"/>

</RelativeLayout>

it a Fragment завышенный в активности (в FrameLayout, который match_parent корневой вид), для которого я добавил android:windowSoftInputMode="adjustResize" в манифесте.

Ответ 3

Извините за поздний ответ, но я надеюсь, что это поможет будущим поисковикам, таким как я.

Решение-1: Android: как я не могу заставить программную клавиатуру выдвигать мой взгляд вверх?

Решение-2: Я нашел решение от этого GitHub-репо KeyboardVisibilityEvent из этого вопроса Как скрыть плавающие кнопки действий с клавиатуры?

Все кредиты идут авторам, спасибо счастливого кодирования.