Заполнение не влияет на <shape> в макете XML

92

Я пытаюсь установить отступ в <shape>объявлении в файле / макете XML. Но что бы я ни установил, с отступом ничего не меняется. Если я изменю какие-либо другие свойства, я увижу их влияние на пользовательский интерфейс. Но это не работает с заполнением. Не могли бы вы посоветовать возможные причины, по которым это могло произойти?

Вот форма 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>
Любомир Дутко
источник

Ответы:

113

Я наконец-то решил проблему с заполнением.

Так что отступы здесь не повлияют на форму. Вместо этого вам нужно будет применить отступы к другому объекту, который будет его использовать. Итак, у меня есть чертеж, в котором используется форма, и я делаю следующее:

<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>

Итак, как вы можете видеть во втором <item>элементе, я установил отступы (сверху и справа). И после этого все работает.

Спасибо.

Любомир Дутко
источник
Привет, я не понимаю, как применить это решение к проблеме. У меня есть кнопка, которая использует форму и настройки adnroid: top и android: right не имеет никакого эффекта. Как мне это решить? Спасибо.
мороженое
2
Я ДУМАЮ, что Любомир говорит о том, чтобы сделать что-то подобное, что у меня работает, но тогда углы всегда имеют непрозрачный белый фон, что вызывает проблемы с отображением (извините за формат в комментариях!): <Layer-list xmlns: android = " schemas.android.com/apk/res/android "> <item> <shape android: shape =" rectangle "> <size android: width =" 0dp "android: height =" 45dp "android: color =" @ android: color / transparent "/> </shape> </item> <item android: top =" 0dp "android: right =" 0dp "android: bottom =" 0dp "android: left =" 0dp "android: drawable =" @ drawable / button_blue_shape "/> </layer-list>
DustinB
Также не по теме, но может быть полезно: если используемый вами drawable - это просто цвет, вы также можете написать как android: drawable = "@ color / divider". НО это ломается на старых устройствах. Я тестировал его на 2.2, и он сломался. Не уверен, на каком уровне это стало приемлемым.
Pijusn 08
Фактически, <item>принимает дочерние чертежи (хотя это явно не документировано). Вот как вы можете добиться такого поведения в одном xml.
Алекс Кон,
3
Этот ответ кажется правильным даже семь лет спустя. Что, черт возьми, <shape><padding> для чего ?
Дэвид Лорд
75

Как упоминалось в нескольких комментариях, лучший подход - обернуть его <shape>в <item>элемент и вместо этого установить отступы. Однако есть и другие варианты, которые подробно описаны по ссылке ниже. например

<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>

В зависимости от ваших потребностей, вместо использования списка слоев, вы можете использовать любой из следующих доступных типов:

  • список слоев
  • селектор
  • список уровней
  • переход

Дополнительные сведения о доступных типах с возможностью рисования см. В этой документации по Android.

Источники:

Это
источник
да, вы не упомянули<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
user924
@ user924 Я не совсем понимаю, о чем вы. Можно включить элемент в <layer-list>, если это служит целям, но это не обязательно ни для исходного вопроса, ни для передачи общего решения, заключающегося в
вложении
3
Я имею в виду, что лучше привести пример, который вы можете копировать и запускать без редакций, но в этом случае <item> не будет разрешен (потому что он должен быть внутри <layer-list>)
user924, 01
2
@ user924 Теперь я понимаю, что вы имеете в виду, большое спасибо за указание на проблему и помощь в улучшении ответа. Я обновил образец кода и добавил комментарий о доступных типах для
рисования
22

Вы можете попробовать вставки:

<?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>
Витольдио
источник
22

Ответ Lyobomyr работает, но здесь применяется то же самое решение, но без накладных расходов на создание нового объекта для рисования, что минимизирует беспорядок в файлах:

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

Скопируйте / вставьте anwser анонсом в ответ SO выше:

<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>

Yahel
источник
1
Спасибо за этот ответ, Яхель, но помните, что нельзя публиковать только ответы по ссылкам. Всегда указывайте в своем ответе всю необходимую информацию, поскольку содержание ссылки может измениться или стать недействительным.
TheIT
Отредактировал ответ
Yahel
9

Я решил эту проблему так:

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

просто добавил к нему прозрачную обводку.

Riverlet
источник
Умно, но я бы счел это взломом: - /
dell116