Benutzerdefiniertes Attribut für benutzerdefinierte Schaltfläche wird nicht angezeigt

Ich habe das Button-Widget erweitert, um mehrere benutzerdefinierte Attribute anwenden zu können.
Eines der Attribute ist ein Farbfilter, den ich beim Erstellen der Schaltfläche auf den Hintergrund anwenden möchte. Es funktioniert nicht. (Siehe die Screenshots und den Code unten)
Ich habe versucht, die Hintergrundfarbe direkt an der gleichen Codestelle einzustellen, und sie ändert die Hintergrundfarbe, ist aber nicht das, was ich brauche, da ich meine eigenen Schaltflächen-PNGs verwende.

Bisher gibt es zwei Probleme:

Der Farbfilter wird nicht angewendetDie benutzerdefinierte Schaltfläche ist versetzt, abgeschnitten und kann nicht angeklickt werden

Die zweite Schaltfläche verwendet die normale Schaltfläche und ist wie erwartet positioniert und anklickbar. Der zweite Screenshot zeigt, dass tatsächlich die richtige Farbe ausgewählt wurde und dass es möglich ist, die Hintergrundfarbe der Schaltfläche an dieser Stelle im Code zu ändern.

Code:

public class MyButton extends Button {
    private int backGroundColor;

    public MyButton(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        TypedArray a = context.getTheme().obtainStyledAttributes(
            attrs, 
            R.styleable.MyButton, 
            defStyle, 
            0);

        try {
            Resources res = getResources();
            switch( a.getInteger(R.styleable.MyButton_type, 0) ) {
            case 0: 
                backGroundColor = res.getColor(R.color.Black); break;
            case 1: 
                backGroundColor = res.getColor(R.color.Red); break;
            case 2: 
                backGroundColor = res.getColor(R.color.DimGray); break;
            }
            getBackground().setColorFilter(backGroundColor, Mode.MULTIPLY);
            //setBackgroundColor(backGroundColor)
        } finally {
            a.recycle();
        }
    }
    public MyButton(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }
    public MyButton(Context context) {
        this(context, null, 0);
    }
}

Das von mir verwendete XML:

<LinearLayout 
    android:layout_width="match_parent"
    android:layout_height="wrap_content">
    <com.example.test.MyButton
        android:id="@+id/btn1"
        android:text="BTN1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:textSize="14sp"
        android:textColor="@color/Blue"
        android:padding="2dp"
        android:layout_margin="4dp"
        android:background="@drawable/key_selector"
        app:type="RedButton"/>
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:textSize="14sp"
        android:textColor="@color/Blue"
        android:padding="2dp"
        android:layout_margin="4dp"
        android:background="@drawable/key_selector"
        android:id="@+id/btn2"
        android:text="BTN2"/>
</LinearLayout>

Screenshot des Ergebnisses von setColorFilter ()

Screenshot des Ergebnisses von setBackgroundColor ()

BEARBEITEN Dies ist das Selektor-XML, das ich für den normalen und den gedrückten Zustand verwende.

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" >

    <item
        android:drawable="@drawable/key1_pressed"
        android:state_pressed="true"/>

    <item 
        android:drawable="@drawable/key1"/>


</selector>

Antworten auf die Frage(1)

Ihre Antwort auf die Frage