2015-10-09 6 views
7

Ich habe die Floating Action Button backgroundTintList Farbe, die durch den folgenden Code:Floating Action-Knopf Randfarbe ändert sich nicht

fab.setBackgroundTintList(ColorStateList.valueOf(mResources.getColor(R.color.fab_color))); 

Aber ich am Ende die immer im Anschluss an API 4.4.2:

enter image description here

Alles sieht gut auf API 21 < = aber irgendetwas unter API 21, habe ich dieses Problem für die FAB.

ich programmatisch die FAB wie so erstellen:

FloatingActionButton fab = new FloatingActionButton(this); 
    CoordinatorLayout.LayoutParams layoutParams = new CoordinatorLayout.LayoutParams(
      ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); 
    fab.setLayoutParams(layoutParams); 
    layoutParams.rightMargin = mResources.getDimensionPixelSize(R.dimen.activity_horizontal_margin); 
    ((CoordinatorLayout) findViewById(R.id.coordinatorLayout)).addView(fab); 

    CoordinatorLayout.LayoutParams p = (CoordinatorLayout.LayoutParams) fab.getLayoutParams(); 
    p.setAnchorId(R.id.appBarLayout); 
    p.anchorGravity = Gravity.BOTTOM | Gravity.END; 
    fab.setLayoutParams(p); 
    fab.setVisibility(View.VISIBLE); 
    fab.setBackgroundTintList(ColorStateList.valueOf(mResources.getColor(R.color.fab_color))); 
    fab.setImageDrawable(getResources().getDrawable(R.drawable.ic_button)); 

ich zufällig auch von der offiziellen source code für die FloatingActionButton laufen, und ich sah, dass sie eine borderDrawable hier Instanziierung:

@Override 
void setBackgroundDrawable(Drawable originalBackground, ColorStateList backgroundTint, 
     PorterDuff.Mode backgroundTintMode, int rippleColor, int borderWidth) { 
    // Now we need to tint the original background with the tint 
    mShapeDrawable = DrawableCompat.wrap(originalBackground.mutate()); 
    DrawableCompat.setTintList(mShapeDrawable, backgroundTint); 
    if (backgroundTintMode != null) { 
     DrawableCompat.setTintMode(mShapeDrawable, backgroundTintMode); 
    } 

    final Drawable rippleContent; 
    if (borderWidth > 0) { // BORDER DRAWABLE RIGHT HERE!! 
     mBorderDrawable = createBorderDrawable(borderWidth, backgroundTint); 
     rippleContent = new LayerDrawable(new Drawable[]{mBorderDrawable, mShapeDrawable}); 
    } else { 
     mBorderDrawable = null; 
     rippleContent = mShapeDrawable; 
    } 

    mRippleDrawable = new RippleDrawable(ColorStateList.valueOf(rippleColor), 
      rippleContent, null); 

    mShadowViewDelegate.setBackgroundDrawable(mRippleDrawable); 
    mShadowViewDelegate.setShadowPadding(0, 0, 0, 0); 
} 

Antwort

7

Ändern Sie einfach die Farbe in Styles-Datei

<item name="colorAccent">@color/colorAccent</item> 

bringen Farbe, die u als Ihre Hintergrundfarbe

für FAB wollen

EDIT: okk .. hier auch eine Alternative, was können Sie tun, um diese .. FAB in Ihrem xml definieren

<android.support.design.widget.FloatingActionButton 
    android:id="@+id/fab" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_gravity="bottom|end" 
    app:backgroundTint="@color/fab_color" 
    android:layout_margin="@dimen/fab_margin" 
    android:src="@android:drawable/ic_dialog_email" /> 

und es wird Änderungen vornehmen und dann müssen Sie nicht programmgesteuert sein.

+2

Ich habe andere Ansichten in der App, die einen bestimmten Farbakzent verwenden müssen, so dass diese Option ein Nein ist, und ist nicht wirklich skalierbar. Dies ist eher eine "nukleare" Option und ich würde das lieber nicht tun. – AndyRoid

+1

Dies ist nicht konstruktiv. – AndyRoid

+0

@AndyRoid überprüfen, sobald ich einen anderen Vorschlag in Antwort hinzugefügt – curiousMind

1

Um nur Hintergrundfarbe Verwendung ändern: app:backgroundTint="#4000FF00"

ZB:

<android.support.design.widget.FloatingActionButton 
     android:id="@+id/fab" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_marginBottom="54dp" 
     android:layout_marginRight="16dp" 
     android:clickable="true" 
     android:src="@drawable/ic_edit" 
     app:layout_anchor="@id/xxxx" 
     app:rippleColor="@android:color/white" 
     app:backgroundTint="#00FF00" 
     app:layout_anchorGravity="bottom|end|right" 
     /> 

Aber wenn Sie wollen, dass es transparent machen, app:elevation und app:pressedTranslationZ Eigenschaft verwenden.

ZB:

<android.support.design.widget.FloatingActionButton 
     android:id="@+id/fab" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_marginBottom="54dp" 
     android:layout_marginRight="16dp" 
     android:clickable="true" 
     android:src="@drawable/ic_edit" 
     app:layout_anchor="@id/xxx" 
     app:borderWidth="0dp" 
     app:rippleColor="@android:color/white" 
     app:backgroundTint="#4000FF00" 
     app:elevation="0dp" 
     app:pressedTranslationZ="0dp" 
     app:layout_anchorGravity="bottom|end|right" 
     /> 

Diese Eigenschaften werden verwendet Ansicht Wirkung auf klicken und Höhe auf Schaltfläche zu geben.

+2

Funktioniert nur für API 21 und ist keine gültige Lösung – AndyRoid

1

Sie müssen wahrscheinlich die Farben in einer rückwärtskompatibel Weise programmatisch ändern:

DrawableCompat.setTintList(DrawableCompat.wrap(fab.getDrawable()), tintColor); < - Symbol

DrawableCompat.setTintList(DrawableCompat.wrap(fab.getBackground()), backgroundTintColor); < - Hintergrund

+0

sehr nützlich! Vielen Dank –

1

I Zugabe endete:

app:borderWidth="0dp" 

diese erstellt nicht borderDrawable und border ist nicht sichtbar.