Pengisi tidak memengaruhi <shape> dalam XML Layout

93

Saya mencoba untuk mengatur padding di <shape>dalam sebuah file / layout XML. Tapi apapun yang saya atur, tidak ada perubahan terkait padding. Jika saya memodifikasi properti lain, saya melihat efeknya pada UI. Tapi itu tidak berfungsi dengan bantalan. Bisakah Anda memberi tahu tentang kemungkinan alasan mengapa hal ini terjadi?

Berikut adalah Bentuk XML yang saya coba gaya:

 <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>
Lyubomyr Dutko
sumber

Jawaban:

113

Saya akhirnya menyelesaikan masalah saya dengan padding.

Jadi padding di sini tidak akan berpengaruh pada bentuk. Alih-alih ini, Anda harus menerapkan padding di drawable lain yang akan menggunakannya. Jadi, saya memiliki drawable yang menggunakan bentuk tersebut dan di sana saya melakukan hal berikut:

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

Jadi, seperti yang Anda lihat di elemen kedua <item>saya mengatur padding (atas dan kanan). Dan setelah ini semuanya bekerja.

Terima kasih.

Lyubomyr Dutko
sumber
Hai, saya tidak mengerti cara menerapkan solusi ini ke masalah tersebut. Saya memiliki tombol yang menggunakan bentuk dan pengaturan adnroid: top dan android: right tidak berpengaruh. Bagaimana saya mengatasi ini? Terima kasih.
es krim
2
SAYA BERPIKIR apa yang Lyubomyr katakan adalah melakukan sesuatu seperti ini, yang berhasil untuk saya, tetapi sudutnya selalu memiliki latar belakang putih buram, menyebabkan masalah tampilan (maaf untuk format di komentar!): <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
Juga di luar topik, tetapi mungkin berguna: jika drawable yang Anda gunakan hanyalah sebuah warna, Anda juga dapat menulis seperti android: drawable = "@ color / divider". TAPI ini rusak pada perangkat lama. Saya mengujinya di 2.2 dan ternyata rusak. Tidak yakin di level mana itu bisa diterima.
Pijusn
Sebenarnya, <item>menerima anak yang dapat digambar (meskipun tidak didokumentasikan secara eksplisit). Begitulah cara Anda mencapai perilaku ini dalam satu xml.
Alex Cohn
3
Jawaban ini tampaknya benar bahkan tujuh tahun kemudian. Apa yang di bumi adalah <shape><padding> untuk ?
David Lord
75

Seperti yang telah disinggung oleh beberapa komentar, pendekatan terbaik adalah dengan membungkus <shape>dalam sebuah <item>elemen dan mengatur padding di sana. Namun ada opsi lain yang tersedia yang dirinci dalam tautan di bawah ini. misalnya

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

Bergantung pada kebutuhan Anda, daripada menggunakan daftar lapisan, Anda dapat menggunakan salah satu jenis drawable berikut:

  • daftar lapisan
  • pemilih
  • daftar tingkat
  • transisi

Untuk informasi selengkapnya tentang tipe drawable yang tersedia, lihat dokumentasi android ini

Sumber:

TheIT
sumber
ya, Anda tidak menyebutkan<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
pengguna924
@ user924 Saya tidak yakin apa maksud Anda. Seseorang dapat menyertakan item di dalam <layer-list> jika itu memenuhi tujuan seseorang, tetapi itu tidak diperlukan untuk pertanyaan asli atau untuk menyampaikan solusi umum yaitu
menumpuk
3
Maksud saya, lebih baik memberikan contoh yang dapat Anda salin dan jalankan tanpa edisi, tetapi dalam kasus ini <item> tidak akan diselesaikan (karena seharusnya ada di dalam <layer-list>)
user924
2
@ user924 Saya mengerti apa yang Anda maksud sekarang, terima kasih banyak telah menunjukkan masalah ini dan membantu meningkatkan jawabannya. Saya telah memperbarui sampel kode dan menambahkan komentar tentang jenis
drawable yang
23

Jawaban oleh Lyobomyr berfungsi, tetapi di sini adalah solusi yang sama diterapkan tetapi tanpa biaya tambahan untuk membuat drawable baru, sehingga meminimalkan kekacauan file:

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

Salin / Tempel jawaban dengan segera pada jawaban SO di atas:

<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
sumber
1
Terima kasih untuk jawaban ini Yahel, tapi ingat untuk tidak memposting link jawaban saja. Selalu berikan semua informasi yang diperlukan dalam jawaban Anda karena konten tautan dapat berubah atau menjadi tidak valid.
TheIT
Diedit jawabannya
Yahel
22

Anda dapat mencoba insets:

<?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>
Witoldio
sumber
9

Saya memecahkan masalah ini seperti ini:

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

baru saja menambahkan guratan transparan padanya.

sungai kecil
sumber
Pintar, tapi saya anggap ini hack: - /
dell116