Das Auffüllen wirkt sich nicht auf <Form> in einem XML-Layout aus

91

Ich versuche, das Auffüllen in einer <shape>deklarierten Datei / einem XML-Layout festzulegen. Aber was auch immer ich einstelle, nichts ändert sich in Bezug auf die Polsterung. Wenn ich andere Eigenschaften ändere, werden die Auswirkungen auf die Benutzeroberfläche angezeigt. Aber es funktioniert nicht mit Polsterung. Könnten Sie bitte die möglichen Gründe mitteilen, aus denen dies auftreten könnte?

Hier ist die XML-Form, die ich zu stylen versuche:

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

Antworten:

111

Ich habe endlich mein Problem mit der Polsterung gelöst.

Die Polsterung hat hier also keinen Einfluss auf die Form. Stattdessen müssen Sie die Polsterung in einem anderen Zeichenelement anwenden, das sie verwendet. Ich habe also eine Zeichnung, die die Form verwendet, und dort mache ich Folgendes:

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

Wie Sie im zweiten <item>Element sehen können, habe ich die Polsterung eingestellt (oben und rechts). Und danach funktioniert alles.

Vielen Dank.

Lyubomyr Dutko
quelle
Hallo, ich verstehe nicht, wie ich diese Lösung auf das Problem anwenden soll. Ich habe eine Schaltfläche, die die Form und Einstellung verwendet. Adnroid: top und android: right hat keine Auswirkung. Wie würde ich das lösen? Vielen Dank.
Eis
2
Ich denke, was Lyubomyr sagt, ist, so etwas zu tun, was für mich funktioniert, aber dann haben die Ecken immer einen undurchsichtigen weißen Hintergrund, was zu Anzeigeproblemen führt (Entschuldigung für das Format in den Kommentaren!): <Layer-Liste xmlns: android = " schemas.android.com/apk/res/android "> <item> <shape android: shape =" rechteck "> <size android: width =" 0dp "android: height =" 45dp "android: color =" @ android: Farbe / transparent "/> </ form> </ item> <item android: top =" 0dp "android: right =" 0dp "android: bottom =" 0dp "android: left =" 0dp "android: drawable =" @ drawable / button_blue_shape "/> </
ayer
Auch außerhalb des Themas, könnte aber nützlich sein: Wenn Ihr verwendetes Zeichen nur eine Farbe ist, können Sie auch wie Android schreiben: drawable = "@ color / divider". ABER dies bricht bei älteren Geräten ab. Ich habe es auf 2.2 getestet und es war kaputt. Ich bin mir nicht sicher, auf welcher Ebene es akzeptabel wurde.
Pijusn
<item>Akzeptiert tatsächlich untergeordnete Zeichen (obwohl dies nicht explizit dokumentiert ist). Auf diese Weise können Sie dieses Verhalten in einer einzelnen XML-Datei erreichen.
Alex Cohn
3
Diese Antwort scheint auch sieben Jahre später richtig zu sein. Was auf der Erde ist <shape><padding> für ?
David Lord
73

Wie einige Kommentare angedeutet haben, besteht der beste Ansatz darin, das <shape>in ein <item>Element zu wickeln und stattdessen die Polsterung dort festzulegen. Es stehen jedoch andere Optionen zur Verfügung, die unter dem folgenden Link aufgeführt sind. z.B

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

Abhängig von Ihren Anforderungen können Sie anstelle einer Ebenenliste einen der folgenden Zeichentypen verwenden:

  • Ebenenliste
  • Wähler
  • Level-Liste
  • Überleitung

Weitere Informationen zu den verfügbaren Zeichentypen finden Sie unter dieser Android-Dokumentation

Quellen:

Das es
quelle
Ja, Sie haben nicht erwähnt<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
user924
@ user924 Ich bin nicht sicher, was dein Punkt ist. Man kann das Element in eine <Layer-Liste> aufnehmen, wenn dies seinen Zwecken dient, aber es ist weder für die ursprüngliche Frage noch für die Vermittlung der allgemeinen Lösung erforderlich, die darin besteht, den Inhalt in einem <Element> mit Polsterung zu
verschachteln
3
Ich meine, es ist besser, ein Beispiel
anzugeben,
2
@ user924 Ich verstehe, was Sie jetzt meinen. Vielen Dank, dass Sie auf das Problem hingewiesen und zur Verbesserung der Antwort beigetragen haben. Ich habe das Codebeispiel aktualisiert und einen Kommentar zu den verfügbaren Zeichentypen hinzugefügt
TheIT
22

Die Antwort von Lyobomyr funktioniert, aber hier wird dieselbe Lösung angewendet, jedoch ohne den Aufwand, ein neues Zeichenobjekt zu erstellen, wodurch die Unordnung in den Dateien minimiert wird:

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

Kopieren / Einfügen der Antwort von anon in die obige SO-Antwort:

<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
quelle
1
Danke für diese Antwort, Yahel, aber denk daran, nicht nur Link-Antworten zu posten. Geben Sie in Ihrer Antwort immer alle erforderlichen Informationen an, da sich der Linkinhalt ändern oder ungültig werden kann.
TheIT
Bearbeitet die Antwort
Yahel
21

Sie können Insets ausprobieren:

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

Ich habe dieses Problem folgendermaßen gelöst:

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

habe gerade einen transparenten Strich hinzugefügt.

Riverlet
quelle
Clever, aber ich würde das als Hack betrachten: - /
dell116