【问题标题】:Padding doesn't affect <shape> in an XML Layout填充不影响 XML 布局中的 <shape>
【发布时间】:2010-11-19 23:09:01
【问题描述】:

我正在尝试在 XML 文件/布局中声明的 &lt;shape&gt; 中设置填充。但是无论我设置什么,与填充相关的都没有变化。如果我修改任何其他属性,我会看到对 UI 的影响。但它不适用于填充。您能否告知可能发生这种情况的可能原因?

这是我要设置样式的 XML 形状:

 <shape xmlns:android="http://schemas.android.com/apk/res/android" 
      android:shape="rectangle">

    <stroke android:width="1dp" 
            android:color="#ffffff" 
            android:dashWidth="2dp"/>

    <solid android:color="@color/button_white_cover"/>

    <corners android:radius="11dp"/>

    <padding android:left="1dp" 
             android:top="20dp"
             android:right="20dp" 
             android:bottom="2dp"/>
 </shape>

【问题讨论】:

    标签: android user-interface


    【解决方案1】:

    我终于解决了我的填充问题。

    所以这里的填充不会对形状产生影响。取而代之的是,您必须在将使用它的其他可绘制对象中应用填充。因此,我有一个使用该形状的可绘制对象,并且我执行以下操作:

    <layer-list xmlns:android="http://schemas.android.com/apk/res/android">
       <item android:drawable="@drawable/shape_below"/>
       <item android:top="10px" android:right="10px" android:drawable="@drawable/shape_cover"/>
    </layer-list>
    

    所以,正如您在第二个 &lt;item&gt;-element 中看到的那样,我设置了填充(顶部和右侧)。在此之后一切正常。

    谢谢。

    【讨论】:

    • 嗨,我不明白如何将此解决方案应用于该问题。我有一个使用形状和设置 adnroid:top 和 android:right 的按钮无效。我将如何解决这个问题?谢谢。
    • 我认为 Lyubomyr 的意思是做这样的事情,这对我有用,但是角落总是有不透明的白色背景,导致显示问题(对不起 cmets 中的格式!):schemas.android.com/apk/res/android">
    • 也是题外话,但可能有用:如果你使用的drawable只是一种颜色,你也可以像 android:drawable="@color/divider" 这样写。但这在旧设备上会中断。我在2.2上测试过,它坏了。不确定它在哪个级别变得可以接受。
    • 实际上,&lt;item&gt; 接受子可绘制对象(尽管没有明确记录)。这就是您可以在单个 xml 中实现此行为的方式。
    • 这个答案即使在七年后似乎也是正确的。 &lt;shape&gt;&lt;padding&gt;for到底是什么?
    【解决方案2】:

    正如几个 cmets 所暗示的,最好的方法是将 &lt;shape&gt; 包装在一个 &lt;item&gt; 元素中,并在那里设置填充。但是,还有其他可用选项,在下面的链接中有详细说明。例如

    <layer-list xmlns:android="http://schemas.android.com/apk/res/android">
        <item
            android:left="8dp"
            android:right="8dp"
            android:top="8dp"
            android:bottom="8dp">
    
            <shape android:shape="rectangle">
                ...
            </shape>
        </item>
    </layer-list>
    

    根据您的需要,您可以使用以下任何可绘制类型,而不是使用图层列表:

    • 层列表
    • 选择器
    • 级别列表
    • 过渡

    有关可用的可绘制类型的更多信息,请参阅this android documentation

    来源:

    【讨论】:

    • 是的,你没有提到&lt;layer-list xmlns:android="http://schemas.android.com/apk/res/android"&gt;
    • @user924 我不确定你的意思是什么。如果符合自己的目的,可以将项目包含在 中,但对于原始问题或传达将内容嵌套在 内并带有填充 的一般解决方案都不是必需的
    • 我的意思是最好举个例子,你可以在没有版本的情况下复制和运行,但在这种情况下 将无法解决(因为它应该在 内)
    • @user924 我明白你现在的意思了,非常感谢您指出问题并帮助改进答案。我更新了代码示例并添加了有关可用可绘制类型的注释
    【解决方案3】:

    您可以尝试插入:

    <?xml version="1.0" encoding="UTF-8"?>
    <inset xmlns:android="http://schemas.android.com/apk/res/android"
        android:insetBottom="2dp"
        android:insetLeft="1dp"
        android:insetRight="20dp"
        android:insetTop="20dp">
    
        <shape android:shape="rectangle">
    
            <stroke
                android:width="1dp"
                android:color="#ffffff"
                android:dashWidth="2dp" />
    
            <solid android:color="@color/button_white_cover" />
    
            <corners android:radius="11dp" />
        </shape>
    
    </inset>
    

    【讨论】:

      【解决方案4】:

      Lyobomyr 的回答有效,但这里应用了相同的解决方案,但没有创建新的可绘制对象的开销,从而最大限度地减少文件混乱:

      https://stackoverflow.com/a/3588976/578746

      在上面的 SO 答案中由 anon 复制/粘贴 anwser:

      <layer-list xmlns:android="http://schemas.android.com/apk/res/android">
          <item android:left="6dp"
                android:right="6dp">
      
              <shape android:shape="rectangle">
                  <gradient android:startColor="#ccd0d3"
                            android:centerColor="#b6babd"
                            android:endColor="#ccd0d3"
                            android:height="1px"
                            android:angle="0"/>
              </shape>
          </item>
      </layer-list> 
      

      【讨论】:

      • 感谢 Yahel 的回答,但请记住不要仅发布链接的答案。始终在您的回答中提供所有必要信息,因为链接内容可能会更改或失效。
      • 编辑了答案
      • sn-p 以上不正确。您仍然需要标签“item”周围的层列表。
      【解决方案5】:

      我这样解决了这个问题:

      <shape android:shape="oval"  >
          <stroke android:width="4dp" android:color="@android:color/transparent" />
          <solid android:color="@color/colorAccent" />
      </shape>
      

      只是给它添加了一个透明的描边。

      【讨论】:

      • 聪明,但我认为这是一个 hack :-/
      猜你喜欢
      • 1970-01-01
      • 2014-10-06
      • 1970-01-01
      • 1970-01-01
      • 2013-06-23
      • 2014-01-15
      • 1970-01-01
      • 2021-08-30
      • 1970-01-01
      相关资源
      最近更新 更多