Android - 设置RadioButton图标的内边距

20

我尝试了很多组合,无论是使用xml还是编程方式,都还没有找到解决方案。下面是场景说明(请注意小红箭头):

图片描述

我有一些单选按钮(RadioButtons)在一个单选组(radio group)中,在xml中可以这样表示:

<RadioGroup
   android:layout_width="fill_parent"
   android:layout_height="wrap_content"
   android:orientation="vertical"
   android:id="@+id/radiobuttons"
   android:paddingBottom="@dimen/activity_vertical_margin"
   android:dividerPadding="30dp">
   <RadioButton android:id="@+id/radio_blue"
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      android:text="How to set the padding on the left of radio pin"
      android:background="@drawable/container_dropshadow"/>
  <!-- other radio buttons... -->
</RadioGroup>

我的问题是我无法找到一种在xml或程序中设置圆形图标左侧填充的方法(我对两者都感兴趣)。 事实上,我尝试修改RadioButton对象中的每个填充似乎只涉及其中的文本(即Java函数setPadding和setCompoundDrawablePadding,或XML android:paddingLeft和android:drawablePadding均不起作用)。

我的container_dropshadow.xml文件如下:

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
   <!-- Drop Shadow Stack -->
   <item>
      <shape>
         <padding android:top="1dp" android:right="1dp" android:bottom="1dp" android:left="1dp" />
         <solid android:color="#00CCCCCC" />
  </shape>
   </item>
   <item>
      <shape>
         <padding android:top="1dp" android:right="1dp" android:bottom="1dp" android:left="1dp" />
         <solid android:color="#10CCCCCC" />
      </shape>
   </item>
   <item>
      <shape>
         <padding android:top="1dp" android:right="1dp" android:bottom="1dp" android:left="1dp" />
         <solid android:color="#20CCCCCC" />
      </shape>
   </item>
   <item>
      <shape>
         <padding android:top="1dp" android:right="1dp" android:bottom="1dp" android:left="1dp" />
         <solid android:color="#30CCCCCC" />
      </shape>
   </item>
   <item>
      <shape>
         <padding android:top="1dp" android:right="1dp" android:bottom="1dp" android:left="1dp" />
         <solid android:color="#50CCCCCC" />
      </shape>
   </item>
   <!-- Background -->
   <item>
      <shape>
         <solid android:color="@android:color/white" />
         <corners android:radius="3dp" />
      </shape>
   </item>
</layer-list>
2个回答

50

我找到了一种方法,使用插入式drawable:

首先,创建一个新的插入式drawable(例如radio_button_inset.xml),其中包含所需的填充和指向主题单选按钮drawable的链接,如下所示:

<inset xmlns:android="http://schemas.android.com/apk/res/android"
      android:drawable="?android:attr/listChoiceIndicatorSingle"
      android:insetLeft="@dimen/your_padding_value"/>

其次,将这个新的可绘制对象用于您的单选按钮:

<RadioButton android:id="@+id/radio_blue"
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      android:text="How to set the padding on the left of radio pin"
      android:background="@drawable/container_dropshadow"
      android:button="@drawable/radio_button_inset"/>

2
对我有用!谢谢! - Arthur
2
很棒的逻辑。成功了! - Brendan
1
如何在使用selector时使用inset?当我使用这个inset drawable来配置android:button时,所有的背景样式都被覆盖了。@martin - mochadwi
1
@Martin,你是个天才。 - Gary Chen
插入可绘制对象有时会导致较低的 API 中默认动画出现问题。 - Krzysiulele
显示剩余3条评论

-2

尝试在RadioGroup上使用paddingStart。由于它是从ViewGroup LinearLayout扩展而来的,所有子元素都会受到影响。

<RadioGroup
   android:layout_width="fill_parent"
   android:layout_height="wrap_content"
   android:orientation="vertical"
   android:id="@+id/radiobuttons"
   android:paddingBottom="@dimen/activity_vertical_margin"
   android:dividerPadding="30dp"
   android:paddingStart="8dp">
   <RadioButton android:id="@+id/radio_blue"
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      android:text="How to set the padding on the left of radio pin"
      android:background="@drawable/container_dropshadow"/>
  <!-- other radio buttons... -->
</RadioGroup>

在您的后台资源中尝试这个。

<!-- Background -->
   <item>
      <shape>
         <padding android:left="8dp" />
         <solid android:color="@android:color/white" />
         <corners android:radius="3dp" />
      </shape>
   </item>

我试过了,但所有的按钮都向右移动了,而引脚左侧的白色边框并没有增加... - madx
1
你能添加container_dropshadow.xml吗?如果你正在使用9-patch,则该效果可以轻松实现。 - Tevin J
好的,已编辑问题并添加了container_dropshadow.xml文件。 - madx
我希望你不打算在你的布局中广泛使用背景。这会导致严重的GPU过度绘制。我已经编辑了我的答案。 - Tevin J
1
不幸的是,我测试了一下,结果是针脚位置相同,但是针脚和文本之间有更大的空白间隔... - madx

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