Padding không ảnh hưởng đến <shape> trong một bố cục XML


92

Tôi đang cố gắng đặt đệm trong một <shape>bố cục / tệp XML được khai báo. Nhưng bất cứ điều gì tôi đặt, không có gì thay đổi liên quan đến phần đệm. Nếu tôi sửa đổi bất kỳ thuộc tính nào khác, tôi sẽ thấy các hiệu ứng trên giao diện người dùng. Nhưng nó không hoạt động với padding. Bạn có thể vui lòng tư vấn về những lý do có thể xảy ra mà điều này có thể xảy ra?

Đây là Hình dạng XML mà tôi đang cố gắng tạo kiểu:

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

Câu trả lời:


113

Cuối cùng tôi đã giải quyết được vấn đề của mình với phần đệm.

Vì vậy độn ở đây sẽ không ảnh hưởng gì đến hình dáng. Thay vì điều này, bạn sẽ phải áp dụng đệm trong có thể kéo khác sẽ sử dụng nó. Vì vậy, tôi có một tệp có thể vẽ sử dụng hình dạng và tôi thực hiện như sau:

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

Vì vậy, như bạn có thể thấy trong phần thứ hai, <item>tôi đặt phần đệm (trên cùng và bên phải). Và sau khi mọi thứ hoạt động.

Cảm ơn.


Xin chào, tôi không hiểu làm thế nào để áp dụng giải pháp này cho vấn đề. Tôi có một nút sử dụng hình dạng và cài đặt adnroid: top và android: right không có tác dụng. Làm thế nào tôi sẽ giải quyết điều này? Cảm ơn.
icecream

2
Tôi NGHĨ những gì Lyubomyr đang nói là làm điều gì đó như thế này, điều này phù hợp với tôi, nhưng sau đó các góc luôn có nền trắng đục, gây ra sự cố hiển thị (xin lỗi vì định dạng trong nhận xét!): <Layer-list xmlns: android = " schemas.android.com/apk/res/android "> <item> <shape android: shape = "angular"> <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

Cũng lạc đề nhưng có thể hữu ích: nếu đồ vẽ của bạn được sử dụng chỉ là màu, bạn cũng có thể viết như android: drawable = "@ color / divider". NHƯNG điều này bị hỏng trên các thiết bị cũ hơn. Tôi đã thử nghiệm nó trên 2.2 và nó đã bị hỏng. Không chắc ở mức độ nào nó đã trở nên chấp nhận được.
Pijusn

Trên thực tế, <item>chấp nhận các bảng vẽ con (mặc dù nó không được ghi lại rõ ràng). Đó là cách bạn có thể đạt được hành vi này trong một xml.
Alex Cohn

3
Câu trả lời này dường như đúng thậm chí bảy năm sau. Có gì trên trái đất là <shape><padding> cho ?
David Lord

75

Như một vài nhận xét đã ám chỉ, cách tiếp cận tốt nhất là bọc phần tử <shape>trong một <item>phần tử và thay vào đó đặt phần đệm ở đó. Tuy nhiên, có các tùy chọn khác có sẵn được trình bày chi tiết trong liên kết bên dưới. ví dụ

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

Tùy thuộc vào nhu cầu của bạn, thay vì sử dụng danh sách lớp, bạn có thể sử dụng bất kỳ loại có thể vẽ nào sau đây:

  • danh sách lớp
  • bộ chọn
  • danh sách cấp
  • chuyển tiếp

Để biết thêm thông tin về các loại có thể vẽ có sẵn, hãy xem tài liệu android này

Nguồn:


yeah, bạn không đề cập đến<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
user924

@ user924 Tôi không chắc quan điểm của bạn là gì. Người ta có thể bao gồm mục bên trong một <layer-list> nếu điều đó phục vụ mục đích của một người, nhưng nó không cần thiết cho câu hỏi ban đầu cũng như để truyền đạt giải pháp chung là lồng nội dung bên trong một <item> với đệm
TheIT

3
Ý tôi là nó tốt hơn để đưa ra một ví dụ mà bạn có thể sao chép và chạy mà không có phiên bản, nhưng trong trường hợp này <item> sẽ không được giải quyết (vì nó phải được bên trong <lớp-list>)
user924

2
@ user924 Tôi hiểu ý bạn bây giờ, cảm ơn bạn rất nhiều vì đã chỉ ra vấn đề và giúp cải thiện câu trả lời. Tôi đã cập nhật mẫu mã và thêm nhận xét về các loại có thể vẽ hiện có
TheIT

22

Bạn có thể thử cài đặt:

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

Câu trả lời của Lyobomyr hoạt động, nhưng đây là giải pháp tương tự được áp dụng nhưng không có chi phí tạo ra một tệp có thể kéo mới, do đó giảm thiểu sự lộn xộn của tệp:

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

Copy / Paste of anwser by anon vào câu trả lời SO ở trên:

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


1
Cảm ơn vì câu trả lời này Yahel, nhưng hãy nhớ đừng đăng câu trả lời chỉ liên kết. Luôn cung cấp tất cả thông tin cần thiết trong câu trả lời của bạn vì nội dung liên kết có thể thay đổi hoặc trở nên không hợp lệ.
TheIT

Đã chỉnh sửa câu trả lời
Yahel

9

Tôi đã giải quyết vấn đề này như thế này:

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

chỉ cần thêm một nét trong suốt vào nó.


Thông minh, nhưng tôi sẽ coi đây là một vụ hack: - /
dell116 22/02/19
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.