23

我正在处理自定义列表视图。我想CheckBox在自定义视图中显示一个。没有文本CheckBox。我发现它的右侧总是有一些空格CheckBox

这是我的布局 xml 文件:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent" android:layout_height="wrap_content"
android:orientation="horizontal" android:background="#fa9654"
android:paddingTop="65dp" android:paddingBottom="65dp">



<TextView android:id="@+id/bus_route_list_item_num"
    android:layout_height="wrap_content" android:layout_width="0dip"
    android:gravity="center" android:layout_gravity="center_vertical|center_horizontal"
    android:layout_weight="0.15"></TextView>

<TextView android:id="@+id/bus_route_list_item_station"
    android:layout_height="wrap_content" android:layout_width="0dip"
    android:gravity="left" android:layout_gravity="center_vertical|center_horizontal"
    android:layout_weight=".5"></TextView>


<TextView android:id="@+id/bus_route_list_item_fee"
    android:layout_height="wrap_content" android:layout_width="0dip"
    android:gravity="center" android:layout_gravity="center_vertical|center_horizontal"
    android:layout_weight=".15"></TextView>


<CheckBox android:id="@+id/bus_route_list_item_reminder" android:layout_height="wrap_content" 
    android:layout_width="0dip" android:layout_weight=".20" android:gravity="center" 
    android:layout_gravity="center" android:paddingRight="0dp" android:paddingLeft="0dp" 
    android:paddingTop="0dp" android:paddingBottom="0dp" android:background="#0066ff" 
    android:text=""
/>

</LinearLayout>

结果看起来像: http:
//pwong.name/checkbox_problem2.jpg

如您所见,复选框右侧有一些空间。我想要的是把复选框放在蓝色区域的中间。

是否可以删除不需要的空间?谢谢

4

6 回答 6

33

默认情况下,复选框具有 minWidth 和 minHeight 值

在此处输入图像描述

您可以将其值设置为 0

<CheckBox
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:minWidth="0dp"
    android:minHeight="0dp" />

结果将是这样,没有任何额外的空格

在此处输入图像描述

于 2020-11-23T11:47:17.870 回答
20

您可以包装CheckBox在 LinearLayout 中,然后android:gravity="center"在该布局上使用。

 <LinearLayout
    android:layout_height="wrap_content"
    android:layout_width="0dip" 
    android:layout_weight=".20"              
    android:background="#ff0000" 
    android:gravity="center">

    <CheckBox android:id="@+id/bus_route_list_item_reminder" 
        android:layout_height="wrap_content" 
        android:layout_width="wrap_content"                     
    />

</LinearLayout>

作为另一种选择,您可以使用RelativeLayout. 这将大大简化您的布局,您将能够摆脱layout_weight.

于 2011-06-15T14:00:09.040 回答
12

以前的解决方案都不适合我,但我尝试将翻译应用于内容并且效果很好,不需要额外的布局层次结构,也不需要实现自己的视图:

                <CheckBox
                ...
                android:text="@null"
                android:translationX="12dp" />

此外,它将元素的边界保持在适当的位置,因此触摸区域不会移动。

于 2017-06-12T13:19:16.530 回答
7

translationX似乎工作。但是,如果您想支持 RTL 布局,就会出现问题。另一种解决方案是将复选框的宽度设置为固定长度(例如26dp):

<CheckBox
    android:layout_width="26dp"
    android:layout_height="wrap_content"
    android:text="@null" />
于 2019-01-12T21:04:00.777 回答
4

要删除图像右侧的额外空间(当没有文本时)扩展 CheckBox 类并覆盖getSuggestedMinimumWidth()方法以返回图像宽度。完整的解决方案:

import android.content.Context;
import android.graphics.drawable.Drawable;
import android.os.Build;
import android.util.AttributeSet;
import android.widget.CheckBox;

public class CheckBoxWithoutText extends CheckBox
{
    private Drawable buttonDrawable;

    public CheckBoxWithoutText(Context context)
    {
        super(context);
    }

    public CheckBoxWithoutText(Context context, AttributeSet attrs)
    {
        super(context, attrs);
    }

    @Override
    protected int getSuggestedMinimumWidth()
    {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1)
        {
            return getCompoundPaddingLeft() + getCompoundPaddingRight();
        }
        else
        {
            return buttonDrawable == null ? 0 : buttonDrawable.getIntrinsicWidth();
        }
    }

    @Override
    public void setButtonDrawable(Drawable d)
    {
        buttonDrawable = d;
        super.setButtonDrawable(d);
    }
}
于 2013-12-04T11:52:45.547 回答
1

我会在这里使用相对布局。对齐父右侧的复选框...

问候, 斯蒂芬

于 2011-06-15T14:01:58.783 回答