2015-09-26 28 views
11

Próbuję użyć Snackbar. Mam FloatingActionButton zapakowany w CoordinatorLayout. Kiedy pokazuje się Snackbar, przycisk jest prawidłowo przesuwany w górę. Kiedy automatycznie się rozłącza, przycisk przesuwa się w dół. Ale jeśli programowo odrzucę program Snackbar, przycisk nie przestanie działać. Mój kod jest prosty:FloatingActionButton nie wyłącza się podczas zamykania paska Snackbar

mSnackbar = Snackbar.make(mCoordinatorLayout, text, Snackbar.LENGTH_LONG) 
       .setAction(R.string.undo, new View.OnClickListener() { 
        @Override 
        public void onClick(View v) { 
         undoDeleteTasks(); 
        } 
       }); 
     mSnackbar.show(); 

Czy istnieje sposób, aby FloatingActionButton ruch w dół, gdy Snackbar zostaje odrzucona programowo?

+1

Nie używaj układu współrzędnych jako widoku. Użyj przycisku FloatingActionButton. Snackbar.make (mFab, text, Snackbar.LENGTH_LONG) –

+1

@EugeneH Próbowałem, ale nie ma różnicy. Fab wciąż trzyma się, gdy snackbar zostanie zwolniony przy użyciu mSnackbar.dismiss(); – allo86

Odpowiedz

16

Spróbuj tego:

Snackbar mysnack = Snackbar.make(fab, "Hi, welcome to my app!", Snackbar.LENGTH_LONG); 
mysnack.getView().addOnAttachStateChangeListener(new View.OnAttachStateChangeListener() { 
    @Override 
    public void onViewAttachedToWindow(View v) { 

    } 

    @Override 
    public void onViewDetachedFromWindow(View v) { 
     fab.setTranslationY(0); 
    } 
}); 
mysnack.show(); 
+0

To działa! Dzięki @ Farzad119. Tylko jeden szczegół. View.OnAttachStateChangeListener został dodany na poziomie interfejsu API 12. Co mógłbym użyć na poziomie interfejsu API 11 lub niższym? – allo86

+0

nie działa dla mnie :( –

11

Problem polega na tym, w CoordinatorLayout, fab zostanie przeniesiony, ponieważ jego zachowanie na onDependentViewChanged() klasa jest wywoływana, gdy Snackbar animuje lub pomniejszyć.

Jednak po wywołaniu Snabackbar.dismiss() animacja nie ma miejsca. I w związku z tym nr onDependentViewChanged(). A zatem ruch FAB.

Chcę wiedzieć, czy jest możliwe, aby albo

  1. ożywione bistrem odwołać?
  2. utworzyć zachowanie, które przenosi FAB, gdy Snackbar powoduje onDependentViewRemoved()?

Odpowiedź Farzad119 jest prawdopodobnie trochę krucha. Moje podejście - choć nie jest zadowalający albo - jest zmiana zachowań na FAB przenieść fab dół, gdy SnackBar usuwa:

@Override 
    public void onDependentViewRemoved(CoordinatorLayout parent, FloatingActionButton child, View dependency) { 
    super.onDependentViewRemoved(parent, child, dependency); 
    float translationY = Math.min(0, parent.getBottom() - child.getBottom()); 
    child.setTranslationY(translationY); 
    } 
+1

To działa dla mnie, ale myślę, że możesz po prostu ustawić tłumaczenie Y na 0, jeśli zależność jest snackbar.snackbarLayout – Cheng

+0

Świetne, dziękuję! Wyjaśnienie wydaje się poprawne, chociaż twój kod nie działał dla ja, ale jak wspomina @Cheng, tłumaczenie ustawień Y na 0 działa. – cuddlecheek

0

Aby rozwiązać ten problem, ja zdefiniował Zachowanie RelativeLayout takiego. Można to zrobić dla dowolnego widoku, wystarczy zastąpić wszystkie RelativeLayout żądanym elementem interfejsu użytkownika.

Następnie należy dodać Zachowanie do właściwości RelativeLayout "android: layout_behavior" w ten sposób. Upewnij się, że RelativeLayout, który chcesz przesunąć, znajduje się również w węźle CoordinateLayout.

<?xml version="1.0" encoding="utf-8"?> 
<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/main_coordinate_layout" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:background="#323232" 
    tools:context="com.choch.michaeldicioccio.myapplication.MainActivity"> 

    <RelativeLayout 
     android:id="@+id/bottom_navigation_relative_layout" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_gravity="bottom" 
     android:gravity="bottom" 
     app:layout_behavior="com.yourPackagePath.RelativeLayoutBehavior" > 

     <android.support.design.widget.BottomNavigationView 
      android:id="@+id/bottom_navigation" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:layout_alignParentBottom="true" 
      android:background="@color/colorPrimary" 
      android:clickable="true" 
      app:elevation="8dp" 
      app:itemBackground="@color/colorPrimary" 
      app:itemIconTint="@drawable/bottom_navigation_color_selector" 
      app:itemTextColor="@drawable/bottom_navigation_color_selector" 
      app:menu="@menu/bottom_bar_menu" /> 

     <android.support.design.widget.FloatingActionButton 
      android:id="@+id/add_car_fab" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_alignParentEnd="true" 
      android:layout_above="@id/bottom_navigation" 
      android:layout_margin="@dimen/fab_margin" 
      android:scaleType="center" 
      android:src="@mipmap/ic_plus_black_36dp" 
      android:tint="@color/colorPrimary" 
      app:elevation="8dp"/> 

    </RelativeLayout> 

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