2015-09-26 44 views
11

我正在嘗試使用Snackbar。我有一個FloatingActionButton裹在CoordinatorLayout。當Snackbar顯示時,該按鈕正確向上移動。當它自動關閉時,按鈕向下移動。但是,如果我以編程方式解僱Snackbar,則該按鈕不會關閉。我的代碼很簡單:解僱Snackbar時FloatingActionButton不會下降

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

有沒有一種方法,使FloatingActionButton向下移動時,Snackbar以編程方式解僱?

+1

請勿將座標佈局用作視圖。使用FloatingActionButton。 Snackbar.make(mFab,text,Snackbar.LENGTH_LONG) –

+1

@EugeneH我試過了,但沒有區別。當小吃店使用mSnackbar.dismiss()解散時,工廠仍然保持不變。 – allo86

回答

16

試試這個:

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

它的工作原理!謝謝@ Farzad119。只是一個細節。 View.OnAttachStateChangeListener已添加到API Level 12中。我可以在API Level 11或更低版本中使用哪些內容? – allo86

+0

不適用於我:( –

11

的問題是,在一個CoordinatorLayout的FAB移動,因爲當Snackbar動畫或縮小其行爲類的onDependentViewChanged()被調用。

但是,當您撥打Snabackbar.dismiss()時,不會發生動畫。因此沒有onDependentViewChanged()。因此FAB的運動。

我想知道是否有可能要麼

  1. 動畫小吃吧解僱?
  2. 創建一個當Snackbar導致onDependentViewRemoved()時移動FAB的行爲?

Farzad119的答案可以說是有點脆弱。我的方法 - 雖然也不令人滿意 - 是改變對FAB行爲移動FAB,當市SnackBar被刪除:

@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

這適用於我,但我認爲你可以設置翻譯Y爲0,如果依賴是snackbar.snackbarLayout – Cheng

+0

太好了,謝謝!解釋似乎是正確的,雖然你的代碼不工作但是正如@Cheng提到的,設置將Y翻譯爲0。 – cuddlecheek

0

爲了解決這個問題,我定義了一個RelativeLayout的行爲是這樣的。這可以在任何視圖中完成,只需將所有RelativeLayout替換爲所需的UI元素即可。

public class RelativeLayoutBehavior extends CoordinatorLayout.Behavior<RelativeLayout> { 

    public RelativeLayoutBehavior(Context context, AttributeSet attrs) { 

    } 

    @Override 
    public boolean layoutDependsOn(CoordinatorLayout parent, RelativeLayout child, View dependency) { 
     return dependency instanceof Snackbar.SnackbarLayout; 
    } 

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

    @Override 
    public void onDependentViewRemoved(CoordinatorLayout parent, RelativeLayout child, View dependency) { 
     child.setTranslationY(0); 
    } 
} 

然後,您需要將行爲添加到像這樣的RelativeLayout「android:layout_behavior」屬性中。確保您想要向上滑動的RelativeLayout也位於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>