2015-10-19 12 views

risposta

-4

NESSUNA necessità di aspetto di Coordinatore con una vista normale allineare lo snack bar per la parte inferiore della vista, e posizionare il pulsante su di esso, il click del pulsante di qualunque sia la vostra logica è spettacolo snack o lineare disposizione.

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 
/*snackbar code 

<LinearLayout 
      android:id="@+id/linear_snack bar" 
      android:layout_width="match_parent" 
      android:layout_height="@dimen/margin_45" 
      android:layout_alignParentBottom="true" 
      android:layout_marginTop="@dimen/margin_0" 
      android:background="@color/dark_grey"> 

      <TextView 
       android:layout_width="0dp" 
       android:layout_height="match_parent" 
       android:layout_weight="1" 
       android:background="@color/orange" 
       android:gravity="center" 
       android:textColor="@color/white" 
       android:textSize="@dimen/text_size_h7" /> 

      <TextView 
       android:layout_width="0dp" 
       android:layout_height="match_parent" 
       android:layout_weight="1" 
       android:gravity="center" 
       android:textSize="@dimen/text_size_h7" /> 
     </LinearLayout> 

<View android:layout_above="@+id/linear_snack bar" 



</RelativeLayout> 
+1

Non riesco a capire se hai già usato snackbar ma questa non è un'implementazione comune. In genere è un avviso dinamico che viene aggiunto in fase di runtime. Se questa è una tecnica che ha funzionato per te, cerca di essere più specifico, piuttosto che commentare in "codice snackbar", che è probabilmente una delle parti più importanti del layout. –

49

Ho intenzione di elaborare la risposta approvata perché penso che ci sia un'implementazione leggermente più semplice di quello che fornisce l'articolo.

non ero in grado di trovare un comportamento integrato che gestisce un movimento generica di punti di vista, ma questo è una buona opzione di uso generale (da http://alisonhuang-blog.logdown.com/posts/290009-design-support-library-coordinator-layout-and-behavior collegato in un altro commento):

import android.content.Context; 
import android.support.annotation.Keep; 
import android.support.design.widget.CoordinatorLayout; 
import android.support.design.widget.Snackbar; 
import android.support.v4.view.ViewCompat; 
import android.util.AttributeSet; 
import android.view.View; 

@Keep 
public class MoveUpwardBehavior extends CoordinatorLayout.Behavior<View> { 

    public MoveUpwardBehavior() { 
     super(); 
    } 

    public MoveUpwardBehavior(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

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

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

    //you need this when you swipe the snackbar(thanx to ubuntudroid's comment) 
    @Override 
    public void onDependentViewRemoved(CoordinatorLayout parent, View child, View dependency) { 
     ViewCompat.animate(child).translationY(0).start(); 
    } 
} 

poi , nel file di layout aggiungere un layout_behavior come di seguito:

<LinearLayout 
    android:id="@+id/main_content" 
    android:orientation="vertical" 
    app:layout_behavior="com.example.MoveUpwardBehavior"/> 

dove il layout_behavior è il percorso completo per il comportamento personalizzato. Non è necessario sottoclasse LinearLayout a meno che non si abbia un'esigenza specifica di avere un comportamento predefinito, il che sembra non comune.

+0

In che modo si differenzia dalla soluzione accettata? –

+7

questa soluzione non richiede la sottoclasse della vista di destinazione, che ritengo sia eccessiva. Inoltre, in genere è consigliabile spiegare la risposta in linea, poiché i collegamenti tendono a scomparire dopo un po '. –

+5

Ottima soluzione. Per supportare anche lo swipe-to-dismiss della barra degli snack, aggiungere il seguente codice: '@Override public void onDependentViewRemoved (CoordinatorLayout parent, Visualizza figlio, Visualizza dipendenza) { super.onDependentViewRemoved (parent, child, dependency); child.setTranslationY (0); } ' – ubuntudroid

2

Ho implementato questo e trovato quando lo snackbar è scomparso la vista è rimasta con lo spazio bianco nel posto snackbars, apparentemente questo è noto se le animazioni sono state disabilitate sul dispositivo.

Per risolvere questo problema ho modificato il metodo onDependentViewChanged per memorizzare la posizione Y iniziale della vista a cui questo comportamento è collegato. Poi sulla rimozione del snackbar ripristinare la posizione di quella vista per la posizione Y memorizzata

private static float initialPositionY; 

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

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

Oltre alla risposta di Travis Castillo: Per consentire l'attivazione snackbars consecutivi, entro onDependentViewChanged(), è necessario annullare qualsiasi animazione, eventualmente in corso iniziata da onDependentViewRemoved():

@Override 
public boolean onDependentViewChanged(CoordinatorLayout parent, View child, View dependency) { 
    float translationY = Math.min(0, ViewCompat.getTranslationY(dependency) - dependency.getHeight()); 
    ViewCompat.animate(child).cancel(); //cancel potential animation started in onDependentViewRemoved() 
    ViewCompat.setTranslationY(child, translationY); 
    return true; 
} 

senza annullare, il LinearLayout salterà al di sotto del 2 ° Bar in quando un Bar in viene sostituito da un altro Bar in.

5

Sulla base di @Travis Castillo risposta. Risolti i problemi come ad esempio:

Moving entire layout up and cause the objects on top of view disappear. 
Doesnt push the layout up when showing SnackBars immediately after eachother. 

Così qui è il codice fisso per MoveUpwardBehavior Classe:

import android.content.Context; 
import android.support.annotation.Keep; 
import android.support.design.widget.CoordinatorLayout; 
import android.support.design.widget.Snackbar; 
import android.support.v4.view.ViewCompat; 
import android.util.AttributeSet; 
import android.view.View; 

@Keep 
public class MoveUpwardBehavior extends CoordinatorLayout.Behavior<View> { 

    public MoveUpwardBehavior() { 

     super(); 

    } 

    public MoveUpwardBehavior(Context context, AttributeSet attrs) { 

     super(context, attrs); 

    } 

    @Override 
    public boolean layoutDependsOn(CoordinatorLayout parent, View child, View dependency) { 

     return dependency instanceof Snackbar.SnackbarLayout; 

    } 

    @Override 
    public boolean onDependentViewChanged(CoordinatorLayout parent, View child, View dependency) { 

     float translationY = Math.min(0, ViewCompat.getTranslationY(dependency) - dependency.getHeight()); 

     //Dismiss last SnackBar immediately to prevent from conflict when showing SnackBars immediately after eachother 
     ViewCompat.animate(child).cancel(); 

     //Move entire child layout up that causes objects on top disappear 
     ViewCompat.setTranslationY(child, translationY); 

     //Set top padding to child layout to reappear missing objects 
     //If you had set padding to child in xml, then you have to set them here by <child.getPaddingLeft(), ...> 
     child.setPadding(0, -Math.round(translationY), 0, 0); 

     return true; 
    } 

    @Override 
    public void onDependentViewRemoved(CoordinatorLayout parent, View child, View dependency) { 

     //Reset paddings and translationY to its default 
     child.setPadding(0, 0, 0, 0); 
     ViewCompat.animate(child).translationY(0).start(); 

    } 
} 

Questi codici spinge fino ciò che l'utente vede sullo schermo e oltre utenti hanno accesso a tutti gli oggetti nel layout, mentre Bar in sta mostrando

Se si desidera che il Bar in coprire gli oggetti invece di spingere e oltre utenti hanno accesso a tutti gli oggetti, allora avete bisogno di cambiare il metodo onDependentViewChanged:

@Override 
public boolean onDependentViewChanged(CoordinatorLayout parent, View child, View dependency) { 

    float translationY = Math.min(0, ViewCompat.getTranslationY(dependency) - dependency.getHeight()); 

    //Dismiss last SnackBar immediately to prevent from conflict when showing SnackBars immediately after eachother 
    ViewCompat.animate(child).cancel(); 

    //Padding from bottom instead pushing top and padding from top. 
    //If you had set padding to child in xml, then you have to set them here by <child.getPaddingLeft(), ...> 
    child.setPadding(0, 0, 0, -Math.round(translationY)); 

    return true; 
} 

e il metodo onDependentViewRemoved:

@Override 
public void onDependentViewRemoved(CoordinatorLayout parent, View child, View dependency) { 

    //Reset paddings and translationY to its default 
    child.setPadding(0, 0, 0, 0); 

} 

Purtroppo si perde l'animazione quando l'utente fa scorrere per rimuovere SnackBar. E devi usare la classe ValueAnimator per creare animazioni per le modifiche al padding che creano dei conflitti qui e devi eseguirne il debug.

https://developer.android.com/reference/android/animation/ValueAnimator.html

Qualsiasi commento sulla animazione per colpo per rimuovere Bar in apprezzata.

Se è possibile saltare l'animazione, è possibile utilizzarla.

In ogni caso, consiglio il primo tipo.

0

Ho scritto una libreria che è possibile aggiungere ulteriori visualizzazioni per animare con SnackProgressBar. Include anche ProgressBar e altre cose. Provalo https://github.com/tingyik90/snackprogressbar

Supponiamo di avere le seguenti viste da animare.

View[] views = {view1, view2, view3}; 

Creare un'istanza di SnackProgressBarManager nella propria attività e include la vista da animare.

SnackProgressBarManager snackProgressBarManager = new SnackProgressBarManager(rootView) 
     .setViewsToMove(views) 

Quando uno SnackProgressBar è mostrato o respinto, questi punti di vista saranno animati di conseguenza.