2016-04-07 20 views
0

Ich versuche, eine benutzerdefinierte Snackbar, wie in diesem Beispiel zu zeigen:Benutzerdefinierte Snackbar funktioniert nicht richtig

how to customize snackBar's layout?

Dies ist mein benutzerdefinierter Code eine Snackbar zu erstellen:

protected void showSnackBar(View view) { 

    Snackbar snackbar = Snackbar.make(view, "", Snackbar.LENGTH_INDEFINITE); 
    Snackbar.SnackbarLayout layout = (Snackbar.SnackbarLayout) snackbar.getView(); 
    TextView textView = (TextView) layout.findViewById(android.support.design.R.id.snackbar_text); 
    textView.setVisibility(View.INVISIBLE); 

    LayoutInflater inflater = LayoutInflater.from(this); 

    View snackView = inflater.inflate(R.layout.custom_snackbar, null); 

    layout.addView(snackView, 0); 

    ViewGroup group = (ViewGroup) snackbar.getView(); 
    group.setBackgroundColor(ContextCompat.getColor(this, R.color.green_wasabi)); 

    snackbar.show(); 

} 

Mein Ziel ist es, eine Methode in meiner Basisaktivität zu haben, um von jeder anderen Aktivität aus aufzurufen.

Aber mein Problem ist, wenn ich die Snackbar zeigen, dass es unter der Tastatur angezeigt wird:

Example

Darüber hinaus nicht alle Ansichten des Layouts nicht zeigen:

<RelativeLayout 
xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:app="http://schemas.android.com/apk/res-auto" 
android:id="@+id/relativelayout_sync_schedule_runs" 
android:layout_height="wrap_content" 
android:layout_width="match_parent" 
android:padding="10dp" 
android:background="@color/green_wasabi" 
android:layout_alignParentBottom="true" 
android:layout_gravity="center_horizontal|bottom"> 

<ProgressBar 
    android:id="@+id/progressbar_infinite" 
    android:layout_width="30dp" 
    android:layout_height="30dp" 
    style="@android:style/Widget.Material.ProgressBar.Small" 
    android:layout_centerVertical="true" 
    android:layout_marginRight="15dp" 
    android:layout_toLeftOf="@+id/textview_sync_runs" 
    android:layout_toStartOf="@+id/textview_sync_runs" /> 


<com.runator.ui.widget.text.CustomTextView 
    android:id="@+id/textview_sync_runs" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="@string/import_runs" 
    android:textColor="@color/black_midnight" 
    style="@style/texts.medium_medium_big" 
    app:font_type="bold" 
    android:gravity="center" 
    android:layout_centerHorizontal="true" 
    android:layout_centerVertical="true"/> 

Wenn jemand irgendwelche Vorschläge hat, werde ich mich freuen, es zu hören.

Vielen Dank im Voraus.

+0

Können Sie Ihre layout.xml-Datei teilen, die zu BaseActivity gehört? –

+0

Meine BaseActivity hat kein Layout – dpulgarin

+0

Es sieht so aus, als ob Sie eine durchsichtige Navigationsleiste verwenden (entweder in Ihren Stilen/Themen oder programmatisch). Deshalb streckt sich Ihr Layout auf die volle Höhe des Displays und Ihre Snackbar wird unten angehängt. Sie können versuchen, android: fitsSystemWindows = "true" zu Ihrem übergeordneten Element in Ihrem Layout hinzuzufügen, aber dann wird der Inhalt nicht hinter der Navigationsleiste angezeigt. Wenn Sie immer noch den Inhalt haben möchten, um sich dahinter zu dehnen, aber den Snacker oben zu haben, müssen Sie seine Position programmatisch ändern, wenn es angezeigt wird. – peshkira

Antwort

2

Zunächst einmal brauchen Sie keine Hintergrundfarbe programmatisch zu setzen, wie Sie bereits, dass in XML-Dateien zu tun sind, so entfernen Sie diese Zeilen

ViewGroup group = (ViewGroup) snackbar.getView(); 
group.setBackgroundColor(ContextCompat.getColor(this, R.color.green_wasabi)); 

Zweitens versuchen, mit Coordinator Layout der Weitergabe die Aktivität als Argument anstelle von Linear/Relative Layout, dh fügen Sie das Koordinatorlayout als übergeordnetes Layout in der Aktivität hinzu und übergeben Sie es.

Überprüfen Sie die Layoutgrenzen des Koordinatorlayouts in der XML-Ansicht. Es sollte die Grenzen der Aktivität nicht erweitern.

+0

Funktioniert gut! Vielen Dank!! – dpulgarin

+0

Kein Problem :). – Yashasvi

2

Können Sie diesen Code zum Hinzufügen der Snackbar auf Ihrer Baseactivity versuchen.

Snackbar snackbar = Snackbar.make(rootView, text, Snackbar.LENGTH_LONG); 
View snackBarView = snackbar.getView(); 
snackBarView.setBackgroundColor(this.mContext.getResources().getColor(R.color.pepapp_bright_red)); 
snackbar.show(); 
+0

Verbringen Sie das gleiche Problem – dpulgarin

1

Code unten funktioniert wie Snackbar, aber voll von benutzerdefinierten (UI, Animation, Aktionen ...) Komponenten.

public class CustomSnackBar extends 
     BaseTransientBottomBar<CustomSnackBar> { 

    /** 
    * Time duration till the snackbar is visible to user 
    */ 
    public static final int DURATION_SEC_2 = 2000; 

    /** 
    * Constructor for the transient bottom bar. 
    * 
    * @param parent The parent for this transient bottom bar. 
    * @param content The content view for this transient bottom bar. 
    * @param callback The content view callback for this transient bottom bar. 
    */ 
    private CustomSnackBar(ViewGroup parent, View content, ContentViewCallback callback) { 
     super(parent, content, callback); 
    } 

    public static CustomSnackBar make(@NonNull ViewGroup parent, @Duration int duration) { 
     final LayoutInflater inflater = LayoutInflater.from(parent.getContext()); 
     final View content = inflater.inflate(R.layout.snackbar_view, parent, false); 
     final ContentViewCallback viewCallback = new ContentViewCallback(content); 
     final CustomSnackBar customSnackbar = new CustomSnackBar(parent, content, viewCallback); 
     customSnackbar.setDuration(duration); 
     return customSnackbar; 
    } 

    public CustomSnackBar setText(CharSequence text) { 
     TextView textView = (TextView) getView().findViewById(R.id.snackbar_text); 
     textView.setText(text); 
     return this; 
    } 

    public CustomSnackBar setAction(CharSequence text, final View.OnClickListener listener) { 
     Button actionView = (Button) getView().findViewById(R.id.snackbar_action); 
     actionView.setText(text); 
     actionView.setVisibility(View.VISIBLE); 
     actionView.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       listener.onClick(view); 
       // Now dismiss the Snackbar 
       dismiss(); 
      } 
     }); 
     return this; 
    } 

    private static class ContentViewCallback implements BaseTransientBottomBar.ContentViewCallback { 

     private View content; 

     public ContentViewCallback(View content) { 
      this.content = content; 
     } 

     @Override 
     public void animateContentIn(int delay, int duration) { 
      ViewCompat.setScaleY(content, 0f); 
      ViewCompat.animate(content).scaleY(1f).setDuration(duration).setStartDelay(delay); 
     } 

     @Override 
     public void animateContentOut(int delay, int duration) { 
      ViewCompat.setScaleY(content, 1f); 
      ViewCompat.animate(content).scaleY(0f).setDuration(duration).setStartDelay(delay); 
     } 
    } 
}