2015-10-09 27 views
7

ho cambiato il colore Floating Action Button backgroundTintList utilizzando il seguente codice:galleggiante Azione Pulsante Colore bordo non cambia

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

Ma finisce per ottenere quanto segue su API 4.4.2:

enter image description here

Tutto sembra a posto su API 21 < = ma qualsiasi cosa sotto l'API 21, ho questo problema per il FAB.

sto programmazione Creazione del FAB in questo modo:

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)); 

Ho anche capitato di correre dal funzionario source code per la FloatingActionButton e ho visto che stanno un'istanza di un borderDrawable qui:

@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); 
} 

risposta

7

basta cambiare il coloraccent nel file degli stili

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

aggiungere colore che u vuole, come il colore di sfondo per la FAB

EDIT: OKK .. bene qui è un'alternativa che cosa si può fare .. definire questo FAB nella tua xml

<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" /> 

e renderà le modifiche e quindi non è necessario essere come programmaticamente.

+2

Ho altre visualizzazioni nell'app che devono utilizzare uno specifico accento di colore, quindi questa opzione è un no go e non è realmente scalabile. Questo è più come un'opzione "Nucleare" e preferirei non farlo. – AndyRoid

+1

Questo non è costruttivo. – AndyRoid

+0

@AndyRoid verifica una volta che ho aggiunto il mio altro suggerimento nella risposta – curiousMind

1

cambiare solo l'uso di fondo colore: app:backgroundTint="#4000FF00"

Esempio:

<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" 
     /> 

Ma se si vuole renderla trasparente, utilizzare app:elevation e app:pressedTranslationZ proprietà.

Esempio:

<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" 
     /> 

Queste proprietà vengono utilizzati per dare vista effetto sullo scatto e l'elevazione a pulsante.

+2

Funziona solo per API 21 e versioni successive non è una soluzione valida – AndyRoid

1

È probabile che sia necessario cambiare i colori a livello di codice in modo retrocompatibile:

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

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

+0

molto utile! Grazie –

1

ho finito di aggiungere:

app:borderWidth="0dp" 

questo non crea borderDrawable e border non è visibile.