2015-09-26 7 views
11

Snackbarを使用しようとしています。私はFloatingActionButtonCoordinatorLayoutで包んでいます。 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(); 

Snackbarがプログラム却下されたときにFloatingActionButton動きをダウンにする方法はありますか?

+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。ちょうど1つの詳細。 View.OnAttachStateChangeListenerがAPIレベル12で追加されました。APIレベル11以下では何が使用できますか? – allo86

+0

私のために働いていない:( –

11

Snackbar内または外にアニメーション化したときに、その動作クラスのonDependentViewChanged()が呼び出されるので、CoordinatorLayoutに、FABが移動されています。

ただし、Snabackbar.dismiss()に電話すると、アニメーションが実行されません。したがって、onDependentViewChanged()はありません。そして、FABの動き。それが可能にどちらか

  1. アニメイトスナックバーが閉じている場合

    私が知りたいですか?

  2. SnackbarによってonDependentViewRemoved()が発生したときにFABを移動するビヘイビアを作成しますか?

Farzad119の回答はおそらく少し脆い。私のアプローチ - に満足のいくものではないのいずれかが - SnackBarが削除されたときFABを下に移動しFABの動作を変更することです:

@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

それは私のために働くが、依存関係がsnackbar.snackbarLayoutなら翻訳Yを0に設定することができると思う。 – 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> 
関連する問題