web-dev-qa-db-ja.com

フローティングアクションボタンの境界線の色が変更されない

Floating Action Button backgroundTintList color次のコードを使用して:

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

しかし、私はAPI 4.4.2で次のようになります。

enter image description here

API 21 <=ですべてが正常に見えますが、API 21以下では、FABにこの問題があります。

私はプログラムでFABを次のように作成しています:

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

たまたま、公式の ソースコードFloatingActionButtonを実行していて、borderDrawableをインスタンス化していることがわかりました。

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

追加を終了しました:

app:borderWidth="0dp"

これはborderDrawableを作成せず、境界線は表示されません。

16
Ivan Stojkovic

スタイルファイルのcoloraccentを変更するだけです

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

fABの背景色として必要な色を追加します

編集:okk ..よくここにあなたができる代替案があります..あなたのxmlでこのFABを定義してください

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

変更が加えられるため、プログラムで行う必要はありません。

7
curiousMind

おそらく、プログラムで下位互換性のある方法で色を変更する必要があります。

DrawableCompat.setTintList(DrawableCompat.wrap(fab.getDrawable()), tintColor); <-アイコン

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

2
Ralph Pina

背景色を変更するには、app:backgroundTint="#4000FF00"を使用します

例えば:

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

ただし、透過的にしたい場合は、app:elevationおよびapp:pressedTranslationZプロパティを使用します。

例えば:

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

これらのプロパティは、ボタンのクリックと仰角にビュー効果を与えるために使用されます。

1
Ram