2015-11-16 4 views
11

Ho visto vari post relativi ai FAB che rispondono ai popup di Snackbar nella parte inferiore dello schermo e ai FAB sensibili al scorrimento. Ma c'è qualche implementazione di FloatingActionButton.Behavior (o simile) per spostare il FAB sopra la tastiera quando si apre?FAB risponde alla tastiera virtuale mostra/nasconde le modifiche

In questo momento, la tastiera copre il FAB quando faccio clic per esempio in una casella EditText. Il mio obiettivo è animare il FAB in modo che sia sempre visibile, indipendentemente dallo stato della tastiera.

MODIFICA: Entrambe android:windowSoftInputMode="adjustResize" e ...="adjustPan" non cambieranno nulla. Bene, adjustResize ridimensiona il layout sottostante (che è nel mio caso una mappa) ma il FAB non si muove.

+0

check http://stackoverflow.com/questions/32216564/move-floating-action-button-above-keyboard – emerssso

+0

Mi sono imbattuto in esso già. OP ha utilizzato un'implementazione personalizzata del FAB senza 'CoordinatorLayout'. Anche cambiare 'windowSoftInputMode' (come suggerito nelle risposte) non aiuta come scritto nel mio EDIT. – mohoff

+0

Hai capito? – David

risposta

2

Ho avuto lo stesso problema, ho provato ad aggiungere uno ScrollView nella mia vista root ma non ha funzionato perché il contenuto non supera l'altezza dello schermo (il fab reagisce come previsto in quel caso).

Così ho provato android:windowSoftInputMode="adjustResize" e funziona per me.

Per informazioni ecco cosa il mio layout xml assomiglia:

<?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> 

è un Fragment gonfiato un'attività (in un FrameLayout che match_parent la vista root) per i quali ho aggiunto android:windowSoftInputMode="adjustResize" nel manifesto.

3

Ciao, so che è vecchio ma per i lettori o gli utenti futuri o attuali e anche il creatore di thread, non ha ancora trovato la risposta. Questo è il modo in cui sto avendo questo comportamento nella mia app.

Fab si nasconde sullo scroll di RecyclerView, si alza quando spuntano gli snack bar, se Fab non viene visualizzato e lo snack bar si apre e se si scorre, Fab verrà visualizzato in cima allo snack bar e si sposterà verso il basso quando SB scompare e ultimo con la tastiera, se si apre, Fab verrà spinto verso l'alto. (Mi dispiace, ho dovuto scrivere coz non so come dare gif con Eclipse emulatore)

Immagine

enter image description here

layout

<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> 

come si può vedo che sto usando la classe FabAnimation per sovrascrivere alcuni dei suoi metodi predefiniti.

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

Non ho un set di installazione di Android per cui non posso testare la tua soluzione, mi dispiace. Ma grazie per averlo pubblicato! – mohoff

+0

Ok, nessun problema :) –