在Android中如何在单选按钮和其标签之间添加边距?

103

在使用Android的内置组件时,是否可以在RadioButton和标签之间添加一点空白以使文本看起来更加舒适?默认情况下,文本看起来有些紧凑。

<RadioButton android:id="@+id/rb1"
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content"
    android:text="My Text"/>

我已经尝试了几种方法:

  1. 指定margin和padding似乎会在整个元素(按钮和文本一起)周围添加空间。这很有道理,但却不能满足我的需求。

  2. 通过XML创建一个自定义的drawable,指定选中和未选中状态的图像,然后在每个图像的右侧添加几个额外的像素。这应该可以解决问题,但是你现在正在脱离默认的用户界面。(这不是世界末日,但也不是理想的解决方案)

  3. 在每个标签的开头添加额外的空格。Android似乎会修剪前导空格字符,例如“ My String”,但指定Unicode U+00A0,例如“\u00A0My String”就可以解决问题。这个方法能用,但看起来有些不妥。

是否有更好的解决方案?

19个回答

137

对于现在阅读此文的任何人,接受的答案会在新的 API 上导致一些布局问题,造成太多的填充。

在 API <= 16 上,您可以设置单选按钮上的 paddingLeft 来设置填充相对于单选按钮的视图边界。此外,九补丁背景也将视图边界相对于视图更改。

在 API >= 17 上,paddingLeft(或 paddingStart)与单选按钮可绘制对象相关。这同样适用于关于九补丁的内容。为了更好地说明填充差异,请参见附加的截屏。

如果你深入研究代码,你会发现在 API 17 中有一个名为 getHorizontalOffsetForDrawables 的新方法。计算单选按钮的左填充时会调用此方法(因此在图片中有额外的空间显示)。

简而言之,如果你的minSdkVersion是>= 17,只需使用paddingLeft。如果您支持API<= 16,则应为您支持的最小SDK设置单选按钮样式,并为API 17+设置另一种样式。

combine screenshots showing left padding differences between API versions


2
API 17 是 Android.os.Build.VERSION_CODES.JELLY_BEAN_MR1。 - KarenAnne
11
最好的方法是使用“values-v17”目录;在那里将API 17+维度放入资源XML中,而16及以下的标准维度则放在普通的“values”目录中。 - akent
21
谷歌的开发者/管理层对我们这些普通开发人员的待遇令人惊讶。他们随心所欲地做任何事情,不论何时何地。对于他们来说,一致性和诚信毫无意义。 - Yar
1
还有没有一种方法可以为单选按钮的可绘制区域设置左边距?那么如何在屏幕左侧和单选按钮可绘制区域之间设置填充(而不是整个单选按钮)。 - Andrew

71

我不确定这是否能解决你的问题,但你尝试过将单选按钮的“左内边距”属性设置为50dip或更多吗?


3
这个方法是有效的,需要50dip来覆盖默认绘图的宽度。一开始我使用了20dip,结果文本向左移动了!这是因为锚定点不是绘图的右边缘,而是绘图的左边缘。 - Robert Claypool

59

我尝试了几种方法,最终找到了这个在模拟器和设备上都正常工作的方法:

    <RadioButton
        android:background="@android:color/transparent"
        android:button="@null"
        android:drawableLeft="@drawable/your_own_selector"
        android:drawablePadding="@dimen/your_spacing" />
  • android:background需要设置为透明,因为在api10上有一个带有内置padding的背景(尚未尝试其他api,但解决方案在其他api上也有效)
  • android:button需要设置为null,否则填充将无法正确工作
  • android:drawableLeft需要指定,而不是 android:button
  • android:drawablePadding是绘制和文本之间的间距

4
最佳答案!您还可以设置android:background =“@ null”,这样看起来就像您所说的没有填充。 - saiyancoder
2
当我设置android:button="@null"时,单选按钮没有被选中(点击)。我做错了什么吗?请帮忙。http://stackoverflow.com/questions/28052820/android-custom-radio-button-not-getting-checked - Shirish Herwade
@Shirish,这个解决方案与您的按钮未被点击无关。我刚刚实现了它并且已经被点击了。 - Yar
感谢您提供的解决方案! - Vimalathithan Rajasekaran

34
使用paddingLeftradiobutton之间添加margin
android:paddingLeft="10dip"

只需设置自定义的填充(padding)

RadioButton 的 XML 属性。

<RadioButton
    android:id="@+id/radHighest"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:button="@drawable/YourImageResource"
    android:drawablePadding="50dp"
    android:paddingLeft="10dip"
    android:text="@string/txt_my_text"
    android:textSize="12sp" />

完成


27

请使用以下XML属性。这对我有用

对于API <= 16,请使用

android:paddingLeft="16dp"

对于API >= 17,请使用:

android:paddingStart="@16dp"

例如:

<android.support.v7.widget.AppCompatRadioButton
        android:id="@+id/popularityRadioButton"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:checked="true"
        android:paddingEnd="@dimen/radio_button_text"
        android:paddingLeft="@dimen/radio_button_text"
        android:paddingRight="@dimen/radio_button_text"
        android:paddingStart="@dimen/radio_button_text"
        android:text="Popularity"
        android:textSize="@dimen/sort_dialog_text_size"
        android:theme="@style/AppTheme.RadioButton" />

输入图像描述

此外:drawablePadding属性无效。它只在您的单选按钮中添加了可绘制项时才起作用。例如:

<RadioButton
    android:id="@+id/radioButton"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center_horizontal"
    android:button="@null"
    android:drawableEnd="@android:drawable/btn_radio"
    android:drawablePadding="56dp"
    android:drawableRight="@android:drawable/btn_radio"
    android:text="New RadioButton" />

6

1
嗯,我尝试了一下,在这种情况下似乎没有任何效果。感谢您的建议,从描述中来看,它肯定是正确的:“绘制对象和文本之间的填充”。 - allclaws

4
final float scale = this.getResources().getDisplayMetrics().density;
checkBox.setPadding(checkBox.getPaddingLeft() + (int)(10.0f * scale + 0.5f),

    checkBox.getPaddingTop(),
    checkBox.getPaddingRight(),
    checkBox.getPaddingBottom());

1
可调整绘制物和文本之间的填充。可以通过在xml文件中添加以下行来实现: android:drawablePadding="@dimen/10dp"

我正好在寻找这个...帮了我很多。 - Shirish Herwade
2
@dimen/10dp 不良实践。 - Vlad

1
只需在API版本高于16的情况下使用padding start即可。

0

我已经尝试过,"android:paddingLeft" 可以起作用。paddingLeft 只会影响文本,而保持单选按钮图像在原始位置。


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