【问题标题】:Left and top padding for CheckBox doesn't workCheckBox 的左侧和顶部填充不起作用
【发布时间】:2018-01-20 09:34:12
【问题描述】:

我想为自定义适配器创建布局。它应该与复选框、图标和文本视图一致。

我对行使用下一个布局 xml 配置:

<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>

但左侧和顶部填充不起作用。当我添加左右填充时,它只会增加右填充值。

此处为示例图片

【问题讨论】:

    标签: android layout padding


    【解决方案1】:

    对于此用例,您必须使用 android:layout_marginLeft

    填充是组件内部的空间。例如:文本和 TextView 边框之间的空间。

    边距是组件外的空间。例如:屏幕左边缘和组件边框之间的空间

    【讨论】:

    • 感谢您这么快的回复。
    • 问题是边距会使复选框的“边距区域”不可点击。我需要它可点击,因此想使用填充,但它根本不移动复选框。
    【解决方案2】:

    聚会有点晚了,但这里有一个解决方案,适合任何寻求方法的人。由于您无法在不添加边距的情况下移动复选框本身,因此您可以覆盖该类:

    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()
        }
    }
    

    如果您不使用材质组件,您可以从AppComptCheckBox 本身扩展您的视图。

    注意:考虑在复选框中添加过多的填充端以补偿画布平移。

    【讨论】: