'Left and top padding for CheckBox doesn't work

I want to create layout for Custom Adapter. It should be line with checkbox, icon and textView.

I use next layout xml configuration for row:

<LinearLayout
        android:id="@+id/list_item_row"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <CheckBox
            android:id="@+id/checkboxFileSelect"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_vertical"
            android:button="@drawable/checkbox_icon"
            android:paddingLeft="10dp"
            android:paddingRight="10dp"
            android:checked="false"
            android:visibility="visible"/>

        <ImageView
            android:id="@+id/folder_icon"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/folder_icon"
            android:layout_gravity="center_vertical"/>

        <TextView
            android:id="@+id/current_folder"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="center_vertical"
            android:textColor="@color/primaryText"/>

    </LinearLayout>

but left and top padding doesn't work. When I add left and right padding it only increase right padding value.

example image here

enter image description here



Solution 1:[1]

You have to use android:layout_marginLeft for this usecase.

Padding is the space inside the component. e.g: space between the text and the border of TextView.

Margin is the space outside the components. e.g: space between left edge of the screen and border of your component

Solution 2:[2]

A bit late to the party but here's a solution for anyone seeking a way to do it. Since there's no way you can move the check box itself without adding margin, you can override the class:

class PaddedCheckBox @JvmOverloads constructor(
        context: Context,
        attrs: AttributeSet? = null,
        defStyle: Int = android.R.attr.checkboxStyle,
) : MaterialCheckBox(context, attrs, defStyle) {
    override fun onDraw(canvas: Canvas) {
        val rtlCoefficient = if (ViewCompat.getLayoutDirection(this) == ViewCompat.LAYOUT_DIRECTION_RTL) -1 else 1
        canvas.save()
        canvas.translate(rtlCoefficient * 40f, 0f)
        super.onDraw(canvas)
        canvas.restore()
    }
}

You can extend your view from AppComptCheckBox itself in case you're not using material components.

Note: Consider adding excessive padding end to your check box to compensate the canvas translation.

Solution 3:[3]

One way I found to accomplish this is to "repackage" the CheckBox's button drawable with insets. In Kotlin:

myCheckbox.buttonDrawable = InsetDrawable(myCheckbox.buttonDrawable, leftPadding, 0, 0, 0)

...where leftPadding is the amount of padding you want to add.

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Bob
Solution 2
Solution 3 Sterling