自定义视图无法以编程方式更改颜色

时间:2018-02-22 11:45:01

标签: android android-custom-view

我有一个自定义视图,看起来像" fab"使用带有drawable的View和FontIconView(library)绘制我们的海关图标。

CustomView XML:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content">

    <android.support.constraint.ConstraintLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content">

        <FrameLayout
            android:id="@+id/round_icon_button_container"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent">

            <View
                android:id="@+id/round_icon_view"
                android:layout_width="@dimen/round_button_size"
                android:layout_height="@dimen/round_button_size"
                android:layout_margin="@dimen/round_button_general_margin"
                android:background="@drawable/circle_shape_map_location"
                android:elevation="@dimen/location_elevation" />

        </FrameLayout>

        <FrameLayout
            android:id="@+id/round_icon_text_container"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            app:layout_constraintBottom_toBottomOf="@+id/round_icon_button_container"
            app:layout_constraintEnd_toEndOf="@+id/round_icon_button_container"
            app:layout_constraintStart_toStartOf="@+id/round_icon_button_container"
            app:layout_constraintTop_toTopOf="@+id/round_icon_button_container">

            <com.shamanland.fonticon.FontIconView
                android:id="@+id/round_icon_text_icon"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="center"
                android:textColor="@color/error_color_red"
                android:textSize="@dimen/round_button_text_size" />
        </FrameLayout>

    </android.support.constraint.ConstraintLayout>
</FrameLayout>

形状XML:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="oval">
    <solid android:color="@color/white_clr" />
    <size
        android:width="42dp"
        android:height="42dp" />
</shape>

在CustomView类中:

public class BSMRoundIconButton extends FrameLayout {

    @InjectView(R.id.round_icon_view)
    View roundView;

    @InjectView(R.id.round_icon_text_icon)
    FontIconView fontIconView;

    private int mLayoutId;

    public BSMRoundIconButton(@NonNull Context context) {
        super(context);
        init(null);
    }

    public BSMRoundIconButton(@NonNull Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        init(attrs);
    }

    public BSMRoundIconButton(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init(attrs);
    }

    protected void init(AttributeSet attrs) {
        mLayoutId = R.layout.bsm_round_icon_button_component;
        loadView();
    }

    private void loadView() {
        inflate(getContext(), mLayoutId, this);
        ButterKnife.inject(this);
    }

    public void setRoundBackgroundColor(int color) {
        Drawable drawableCompat = this.roundView.getBackground();
        drawableCompat.setColorFilter(color, PorterDuff.Mode.DST);
        this.roundView.setBackground(drawableCompat);

    }

    public void setRoundSize(int width, int height) {
        this.roundView.getLayoutParams().height = height;
        this.roundView.getLayoutParams().width = width;
    }

    public void setIcon(String icon) {
        this.fontIconView.setText(icon);
    }

    public void setIconColor(int color) {
        this.fontIconView.setTextColor(color);
        invalidate();
    }

    public void setIconSize(int size) {
        this.fontIconView.setTextSize(size);
    }
}

问题是我们需要更改背景和图标的颜色。

我们做了几种方法:

public void setRoundBackgroundColor(int color) {
    Drawable drawableCompat = getResources().getDrawable(R.drawable.circle_shape_map_location);
    drawableCompat.setColorFilter(color, PorterDuff.Mode.DST);
    this.roundView.setBackground(drawableCompat);
}

public void setIconColor(int color) {
    this.fontIconView.setTextColor(color);
}

但是当这样使用时:

this.roundIconButton.setRoundBackgroundColor(R.color.bright_green);
this.roundIconButton.setIconColor(R.color.bright blue);

背景不会改变颜色,同时图标采用混合颜色(在该示例中,xml设置为红色,蓝色代码)显示为紫色。

我试图使观看无效,但不起作用。

也许我忘记了一些步骤?

1 个答案:

答案 0 :(得分:0)

调用// input attributes... document.getElementsByName('ptitle')[0].placeholder = 'Your Title Here...'; document.getElementsByName('ptitle')[0].maxLength = '28'; 后,您需要调用invalidate roundIconButton.invalidate()方法。这会导致视图重绘,因此您的颜色会更新。

同样在您的自定义视图中,在roundIconButton.setIconColor(R.color.bright blue);方法中作为最后一行,您可以添加setIconColor并执行相同的操作..只需更好的代码格式化。

如果这样可以解决您的问题,请告诉我