使FAB响应软键盘显示/隐藏更改

时间:2015-11-16 23:55:39

标签: android floating-action-button

我见过各种关于FAB响应屏幕底部的Snackbar弹出窗口以及滚动敏感FAB的帖子。但是当弹出时,是否有一些FloatingActionButton.Behavior(或类似的)实现将FAB移到键盘上方

现在,当我在EditText框中点击时,键盘会覆盖FAB。我的目标是为FAB设置动画,使其始终可见,与键盘状态无关。

编辑android:windowSoftInputMode="adjustResize"...="adjustPan"都不会改变任何内容。好吧,adjustResize调整底层布局的大小(在我的例子中是一张地图),但FAB不会移动。

2 个答案:

答案 0 :(得分:3)

我遇到了同样的问题,我尝试在我的根视图中添加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>

Fragment在一个活动中膨胀(在FrameLayout match_parent根视图中),我在清单中添加了android:windowSoftInputMode="adjustResize"

答案 1 :(得分:3)

嗨,我知道它已经老了但是对于未来或现在的读者/搜索者以及线程制作者,他还没有找到答案。这就是我在我的应用程序中出现这种行为的方式。

Fab隐藏在RecyclerView滚动上,当小吃店弹出时上升,如果没有显示fab并且快餐栏弹出,如果你滚动那么仍然Fab将显示在小吃店的顶部并且当SB消失时将向下移动并且持续键盘如果打开,Fab将被推高。 (对不起,我不得不写因为我不知道如何用eclipse模拟器给gif)

图片

enter image description here

<强>布局

<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();
    }
 }
}