如何移除Android CheckBox周围的填充

88

我需要将复选框放在我的图片视图的右上角。但是当我这样做时,我注意到周围有一个默认的边距。有没有办法去掉它?

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

    <FrameLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true" >

        <ImageView
            android:id="@+id/thumbImage"
            android:layout_width="100dp"
            android:layout_height="132dp"
            android:layout_gravity="center" />
    </FrameLayout>

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_alignParentTop="true"
        android:background="#ff0000"
        android:gravity="center" >

        <CheckBox
            android:id="@+id/itemCheckBox"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentEnd="true"
            android:layout_gravity="center"
            android:button="@drawable/checkbox_background"
            android:paddingLeft="0dp"
            android:paddingTop="0dp" />

    </LinearLayout>

</RelativeLayout>
7个回答

178

现在有一个更好的方法来做这件事:

android:minWidth="0dp"
android:minHeight="0dp"

@Seza 尝试使用 com.google.android.material:material:1.0.0 中的 MaterialCheckBox。 - Rishabh876
1
我认为答案很简单而且不错。它移除了没有文本的复选框中的右侧填充。 - mazend
3
对于那些以编程方式进行操作并遇到困难的人,请尝试使用 minimumHeightminimumWidth 而不是 minWidthminHeight - masterwok
2
@masterwok 谢谢,我一直在寻找这个。 - Abhishek Garg
必须接受答案,因为这是正确的解决方案。谢谢朋友。 - undefined
显示剩余2条评论

39

如何在Android中去除单选按钮的默认边距或填充

如果您正在使用XML

android:minWidth="0dp"
android:minHeight="0dp"

如果是以编程方式使用

 radiobtn.setMinimumHeight(0);
 radiobtn.setMinimumWidth(0);

1
谢谢!这个最简单,不涉及负边距! - Filipkowicz
1
这是唯一一个在所有情况下都有效的解决方案,因为其他答案中提到的负边距在ConstraintLayout中不起作用。 - muthuraj
1
这是最简单的解决方案。谢谢 :) - Ramakrishna Joshi

33

你可以使用负边距。

android:layout_marginTop = "-5dp"
android:layout_marginRight = "-5dp"

6
请注意,您的测试可能会失败,因为Espresso“至少无法看到90%的复选框”。 - azizbekian
ConstraintLayout 有什么解决方案吗? - casolorz
1
你可以使用 Android 的 android:translationX="-5dp",但这不是一个好的解决方案。 - Vladislav Shcherbakov
最佳答案。谢谢。 - Fereshteh Naji
@BenitoBertoli 我不知道我是什么样的人,但那时这仍然不是正确的方式。请不要躲在“答案已过时”的后面。 - Farid

5

这对我在约束布局中有效。我希望它也适用于其他布局。

<androidx.appcompat.widget.AppCompatCheckBox
                ...
                android:translationX="-5dp"
                 />

1
请不要在你不知道真正后果的情况下,只因为它“能用”就发帖解答。这将会在长期运行中带来成千上万的复杂问题。 - Farid

2
如果您查看CompoundButton类的源代码,该类由复选框类扩展,在onDraw()方法中,填充取决于重力。
  @Override
    protected void onDraw(Canvas canvas) {
        ...

            final int top;
            switch (verticalGravity) {
                case Gravity.BOTTOM:
                    top = getHeight() - drawableHeight;
                    break;
                case Gravity.CENTER_VERTICAL:
                    top = (getHeight() - drawableHeight) / 2;
                    break;
                default:
                    top = 0;
            }
       ...
    }

所以你可以将属性gravity的xml值设置为
android:gravity="top|start" 但是只有当你不想在复选框中使用文本时才能使用此方法,因为gravity属性用于居中文本。

0
感谢@VladislavShcherbakov的评论,它是:
android:paddingLeft="-5dp"
android:layout_marginStart="-5dp"
android:layout_marginLeft="-5dp"
// android:translationX="-5dp"

-4

为什么要用负边距和其他复杂的方法呢?使用简单直接的方式,给FrameLayout添加内边距而不是最上层的RelativeLayout即可解决问题。由于第二个布局中只有复选框,因此无需为其添加内边距。

如果您遇到任何问题或有任何进一步的疑问,请告诉我。


只是说因为在问题中你需要的不是填充,而是需要删除一些已经存在的填充。这只会发生在旧版的Android系统中,其中勾号的尾巴超出了复选框。 - Lincy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接