Doldurma, bir XML Düzeninde <shape> 'i etkilemez


92

<shape>Bir XML dosyası / düzeni içinde bildirilen bir dolguyu ayarlamaya çalışıyorum . Ama ne ayarlasam da, dolgu ile ilgili hiçbir şey değişmiyor. Başka herhangi bir özelliği değiştirirsem, UI üzerindeki etkilerini görüyorum. Ancak dolgu ile çalışmaz. Bunun meydana gelmesinin olası nedenleri hakkında bilgi verebilir misiniz?

İşte stil vermeye çalıştığım XML Şekli:

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

Yanıtlar:


113

Sonunda dolgu ile ilgili sorunumu çözdüm.

Yani buradaki dolgu yapmanın şekil üzerinde hiçbir etkisi olmayacaktır. Bunun yerine, onu kullanacak diğer çekmecelere dolgu uygulamanız gerekecektir. Yani, şekli kullanan bir çekmecem var ve orada aşağıdakileri yapıyorum:

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

Böylece, ikinci <item>öğede de görebileceğiniz gibi, dolguyu (üst ve sağ) ayarlıyorum. Ve bundan sonra her şey çalışıyor.

Teşekkürler.


Merhaba, bu çözümü soruna nasıl uygulayacağımı anlamıyorum. Adnroid: top ve android: right'ın şeklini ve ayarını kullanan bir düğmem var: right'ın etkisi yok. Bunu nasıl çözerim? Teşekkürler.
icecream

2
Lyubomyr'in söylediği şeyin benim için işe yarayan böyle bir şey yapmak olduğunu DÜŞÜNÜYORUM, ancak o zaman köşeler her zaman opak beyaz bir arka plana sahip olur ve görüntüleme sorunlarına neden olur (yorumlarda format için üzgünüm!): <Layer-list xmlns: android = " schemas.android.com/apk/res/android "> <item> <şekil android: şekil =" dikdörtgen "> <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

Ayrıca konu dışı ama faydalı olabilir: eğer kullandığınız çekilebilir ürün yalnızca bir renkse, android: drawable = "@ color / divider" gibi de yazabilirsiniz. ANCAK bu, eski cihazlarda bozulur. 2.2'de test ettim ve bozuldu. Hangi düzeyde kabul edilebilir hale geldiğinden emin değilim.
Pijusn

Aslında, <item>çocuk çekmecelerini kabul eder (açıkça belgelenmemiş olmasına rağmen). Bu davranışı tek xml'de bu şekilde elde edebilirsiniz.
Alex Cohn

3
Bu cevap, yedi yıl sonra bile doğru görünüyor. Dünya ne <shape><padding> için ?
David Lord

75

Birkaç yorumun ima ettiği gibi, en iyi yaklaşım <shape>bir <item>öğeyi sarmak ve onun yerine dolguyu oraya ayarlamaktır. Bununla birlikte, aşağıdaki bağlantıda ayrıntıları verilen başka seçenekler de mevcuttur. Örneğin

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

İhtiyaçlarınıza bağlı olarak, bir katman listesi kullanmak yerine aşağıdaki çekilebilir türlerden herhangi birini kullanabilirsiniz:

  • katman listesi
  • seçici
  • seviye listesi
  • geçiş

Mevcut çekilebilir türler hakkında daha fazla bilgi için bu android belgelerine bakın

Kaynaklar:


evet, bahsetmedin<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
user924

@ user924 Ne demek istediğinden emin değilim. Kişi, amacına hizmet ediyorsa, öğeyi bir <layer-list> içine dahil edebilir, ancak asıl soru için veya içeriği <item>
dolgulu

3
Demek istediğim, sürümler olmadan kopyalayıp çalıştırabileceğiniz bir örnek vermek daha iyidir, ancak bu durumda <item> çözülmeyecektir (çünkü <layer-list> içinde olmalıdır)
user924

2
@ user924 Ne demek istediğini şimdi anlıyorum, soruna işaret ettiğin ve cevabın iyileştirilmesine yardımcı olduğun için çok teşekkürler. Kod örneğini güncelledim ve mevcut çekilebilir türler hakkında bir yorum ekledim
TheIT

22

Ekleri deneyebilirsiniz:

<?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'in cevabı işe yarıyor, ancak burada aynı çözüm uygulandı, ancak yeni bir çekilebilir yaratma yükü olmadan, dolayısıyla dosya karmaşasını en aza indirgiyor:

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

Yukarıdaki SO cevabına cevaplayıcıyı anon olarak Kopyala / Yapıştır:

<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
Cevabınız Yahel için teşekkürler, ancak sadece cevapları link göndermemeyi unutmayın. Bağlantı içeriği değişebileceğinden veya geçersiz olabileceğinden her zaman yanıtınızda gerekli tüm bilgileri sağlayın.
TheIT

Cevabı
Yahel

9

Bu sorunu şu şekilde çözdüm:

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

ona şeffaf bir vuruş ekledim.


Akıllıca, ancak bunu bir hack olarak değerlendiririm: - /
dell116
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.