Android: установите маржу слева от радиообмена.

Jan 10 2021

Я хочу установить поле / отступ между моим выводимым радиокнопкой и его левой стороной, например: Установка поля 8dp между моим выводимым радиокнопкой и левой стороной экрана. Я знаю, как установить запас между самим радиокнопкой, но не знаю, как сделать это с возможностью рисования радиокнопки. Я также знаю, как установить поле справа от радиокнопки, которое можно рисовать с помощью paddngStart = "YOUR_PADDING".

Это возможно?

Вот картина того, что я имею в виду:

В настоящее время

Что я хочу

РЕДАКТИРОВАТЬ

Приведенный выше письменный ответ действительно работает. Для тех, кто хочет установить значение внутри макета, а не программно, я написал адаптер привязки:

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

Затем вы можете использовать его в макете CustomRadioButton с помощью app:setDrawableLeftPadding="@{8f}"

Ответы

1 mhdwajeeh.95 Jan 10 2021 at 23:20

Если вы хотите добиться того же, что и на втором изображении, вы можете написать RadioButtonпользовательский код, который обрабатывает это заполнение, код пользовательского представления может быть таким (в 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)
    }
}

Вы можете установить значение заполнения, задав значение поля startPadding, например:

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

// or

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