Android: définir la marge sur le côté gauche du bouton radio dessinable

Jan 10 2021

Je veux définir une marge / padding entre mon radiobutton drawable et le côté gauche de celui-ci, par exemple: Définition d'une marge de 8dp entre mon radiobutton drawable et le côté gauche de l'écran. Je sais comment définir une marge entre le radiobutton lui-même, mais pas comment le faire avec le radiobutton drawable. Je sais aussi comment définir une marge côté droit du radiobutton dessinable avec paddngStart = "YOUR_PADDING".

Est-ce possible?

Voici une image de ce que je veux dire:

Actuellement

Ce que je veux

ÉDITER

La réponse écrite ci-dessus fonctionne. Pour ceux qui veulent définir la valeur à l'intérieur de la mise en page et non par programme, j'ai écrit un adaptateur de liaison:

@BindingAdapter("setDrawableLeftPadding")
fun setDrawableLeftPadding(view: CustomRadioButton, padding: Float) {
    view.setStartPaddingDp(padding)
}

Vous pouvez ensuite l'utiliser dans votre disposition CustomRadioButton avec app:setDrawableLeftPadding="@{8f}"

Réponses

1 mhdwajeeh.95 Jan 10 2021 at 23:20

Si vous voulez obtenir exactement la même chose sur ce que votre deuxième image montre, vous pouvez écrire une personnalisation RadioButtonqui gère ce remplissage, le code de vue personnalisé peut être comme ceci (dans Kotlin) :

import android.content.Context
import android.graphics.Canvas
import android.util.AttributeSet
import androidx.appcompat.widget.AppCompatRadioButton

class CustomRadioButton : AppCompatRadioButton {

    // the value of your padding (in pixels) from the start of the radio button
    var startPadding: Int = 0
        get
        set(value) {
            field = value
            requestLayout()
        }

    constructor(context: Context?) : super(context)
    constructor(context: Context?, attrs: AttributeSet?) : super(context, attrs)
    constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int) : super(
        context,
        attrs,
        defStyleAttr
    )


    fun setStartPaddingDp(paddingDp: Float) {
        startPaddingPx = (paddingDp * context.resources.displayMetrics.density).toInt()
    }


    override fun onDraw(canvas: Canvas?) {
        // todo: handle Right-To-Left layouts
        canvas?.translate(startPadding.toFloat(), 0f)

        super.onDraw(canvas)
    }

    override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec)

        setMeasuredDimension(measuredWidth + startPadding, measuredHeight)
    }
}

Vous pouvez définir la valeur de remplissage en définissant la valeur du champ startPadding, par exemple:

yourCustomRadioButton.startPadding = 100 // this value is in pixels

// or

yourCustomRadioButton.setStartPaddingDp(100) // this value is in DP