Offener Android-Schlaganfall?

93

Ist es möglich, ein Android-Formobjekt mit Strich nur auf bestimmten Seiten zu erstellen?

ZB habe ich:

<stroke 
 android:width="3dip" 
 android:color="#000000"
    android:dashWidth="10dip" 
    android:dashGap="6dip" />

Welches ist ähnlich zu diesem CSS:

border: 3px dashed black;

Wie kann ich den Strich nur auf einer Seite einstellen? So würde ich es in CSS machen:

border-left: 3px dashed black;

Wie macht man das in Android XML?

Reed Morse
quelle

Antworten:

125

Mit dieser habe ich eine gute Lösung erreicht:

<?xml version="1.0" encoding="utf-8"?>

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<!-- This is the line -->
    <item android:top="-1dp" android:right="-1dp" android:left="-1dp">
      <shape>
            <solid android:color="@android:color/transparent" />
            <stroke android:width="1dp" android:color="#ffffff" />
      </shape>
    </item>

</layer-list>

Dies funktioniert gut, wenn Sie einen transparenten Hintergrund, aber dennoch eine offene Strichfarbe benötigen (in meinem Fall brauchte ich nur eine untere Zeile). Wenn Sie eine Hintergrundfarbe benötigen, können Sie eine Volltonfarbe hinzufügen, wie in Maragues Antwort.

BEARBEITEN 1

Bei Geräten mit hoher Dichte kann die Verwendung niedriger Eintauchwerte manchmal zu sehr dünnen oder unsichtbaren Strichen oder Abständen führen. Dies kann Ihnen auch beim Festlegen von ListView-Teilern passieren.

Die einfachste Problemumgehung besteht darin, einen Abstand von 1px anstelle von 1dp zu verwenden. Dadurch wird die Linie bei allen Dichten immer sichtbar. Die beste Lösung wäre, Dimensionsressourcen für jede Dichte zu erstellen, um die beste Größe für jedes Gerät zu erhalten.

Bearbeiten 2

Spaß, aber ich habe 6 Jahre später versucht, dies zu verwenden, und ich kann auf Lollipop-Geräten kein gutes Ergebnis erzielen.

Wahrscheinlich besteht die aktuelle Lösung darin, 9-Patch zu verwenden. Android hätte nach all dieser Zeit eine einfache Lösung für dieses Problem finden sollen.

htafoya
quelle
Das hat auch bei mir funktioniert, aber ich weiß nicht genau, warum ich -2dp anstelle von -1dp verwenden musste. Wenn ich letzteres benutzte, konnte ich immer noch eine dünne Linie sehen.
Edu Zamora
1
@EduZamora ja es scheint, dass für Geräte mit hoher Dichte -1dp nicht wie erwartet
funktioniert
Ich bekomme auch Grenze für alle Seiten, aber nicht nur unten Grenze.
Cheok Yan Cheng
@YanChengCHEOK versuchen Sie es mit 1px anstelle von 1dp.
Htafoya
@htafoya das ist eine geniale Lösung. Vielen Dank!
Abriggs
52

Ich weiß, dass diese Frage vor langer Zeit gestellt wurde, daher wird die Antwort nicht von der Person verwendet, die diese Frage gestellt hat, aber sie kann dennoch anderen helfen.

 <?xml version="1.0" encoding="UTF-8"?>
    <!-- inset is used to remove border from top, it can remove border from any other side-->
    <inset xmlns:android="http://schemas.android.com/apk/res/android"
        android:insetTop="-2dp"
        >
    <shape xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/rectangle">
        <stroke android:width="1dp" android:color="#b7b7b7" />
        <corners android:bottomRightRadius="5dp"  android:bottomLeftRadius="5dp"/>

        <solid android:color="#454444"/>
    </shape>
    </inset>

Verwenden Sie das insetTag und geben Sie einen negativen Wert für den Seitenrand an, den Sie entfernen möchten.

Die möglichen Werte sind:

android:insetTop="-1dp" android:insetBottom="-1dp" android:insetLeft="-1dp" android:insetRight="-1dp"

Nirmal Dhara
quelle
Ja und tu nicht das, was ich getan habe und versuche, den Einschub in das Strich-Tag zu setzen, ohne den Rest der Antwort zu lesen! (Danke für die Antwort BTW OP. Perfekte Lösung)
Kiran
elegant! Ich liebe diese Lösung
Hao Qi
41

Ich habe dies gelöst, indem ich eine Listenebene verwendet habe, die zwei Formen kombiniert, von denen eine mit einer Höhe von 1 dp unten platziert ist

optionscreen_bottomrectangle.xml:

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<!-- This is the line -->
<item>
      <shape>
            <solid android:color="#535353" />
      </shape>
</item>
<!-- This is the main color -->
<item android:bottom="1dp">
     <shape>
           <solid android:color="#252525" />
     </shape>
</item>
</layer-list>

Dann in der Datei layout / main.xml

<TextView
    android:id="@+id/bottom_rectangle"
    android:background="@drawable/optionscreen_bottomrectangle"
    android:layout_width="fill_parent"
    android:layout_height="0dp"
    android:layout_below="@id/table_options"
    android:layout_above="@id/exit_bar"/>

Dies füllt die Lücke zwischen table_options und exit_bar mit einem Hintergrund und druckt kurz vor exit_bar eine 1dp-Zeile. Das hat den Trick für mich getan, ich hoffe es hilft jemand anderem.

Antwort bearbeitet, um Ebenen in der richtigen Reihenfolge zu platzieren. Danke Alex!

Maragues
quelle
Es kann nützlich sein, keine Antwort zu posten, wenn Sie wirklich selbst eine Antwort haben möchten. Wenn andere Entwickler sehen, dass es bereits eine Antwort gibt (obwohl dies in diesem Fall tatsächlich nicht der Fall ist), sind sie nicht so geneigt zu antworten.
MrSnowflake
31

Ein anderer nimmt die anderen Antworten stattdessen mit Polsterung auf. Dieses kleine Snipplet bildet oben und unten einen Rand.

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- This is the line -->
    <item>
          <shape>
                <padding android:left="0dp" android:top="1dp" android:right="0dp" android:bottom="1dp"/>
                <solid android:color="#898989" />
          </shape>
    </item>
    <!-- This is the main color -->
    <item>
         <shape>
             <solid android:color="#ffffff" />
         </shape>
    </item>
</layer-list>
ug_
quelle
4
Dies ist bei weitem die beste Antwort, wenn Sie abgerundete Ecken benötigen.
MacKinley Smith
Dieser hat mir auch enorm geholfen. Bitte probieren Sie es aus und stimmen Sie ab
Boy
@ug_ Ich denke, das ist der beste Ansatz. Funktioniert perfekt, danke
Lalit Sharma
Funktioniert. Sieht im Vorschaufenster von Android Studio (v1.1) völlig falsch aus, aber auf dem Gerät ist es in Ordnung.
Murat Ögat
26

Die Antwort von @ Maragues ist rückwärts, da die Drawables der Ebenenliste von oben nach unten gezeichnet werden (dh das letzte Element in der Liste wird oben gezeichnet):

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<!-- This is the line -->
<item>
      <shape>
            <solid android:color="#535353" />
      </shape>
</item>
<!-- This is the main color -->
<item android:bottom="1dp">
     <shape>
           <solid android:color="#252525" />
     </shape>
</item>

</layer-list>

Dadurch wird die Form effektiv mit der Linienfarbe gefüllt und anschließend die Hintergrundfarbe darüber gezeichnet, sodass die letzten 1 dp frei bleiben, damit die Linienfarbe durchscheint.

Alex Pretzlav
quelle
2
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >


<item>
    <shape android:shape="rectangle" >
        <stroke  android:width="2dp"
                 android:color="#BBBBBB" />
        <solid android:color="@android:color/transparent" />
    </shape>
</item>
<item  android:bottom="2dp" >
    <shape android:shape="rectangle" >
        <stroke  android:width="2dp"
                 android:color="@color/main_background_color" />
        <solid android:color="@android:color/transparent" />
    </shape>
</item>

sonnig
quelle
2

Ich habe folgenden Code verwendet.

<?xml version="1.0" encoding="UTF-8"?>
<!-- inset is used to remove border from top, it can remove border from any other side-->
<inset xmlns:android="http://schemas.android.com/apk/res/android"
    android:insetTop="-2dp" android:insetLeft="-2dp" android:insetRight="-2dp"
    >
    <shape xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/rectangle">
        <stroke android:width="1dp" android:color="@color/colorPrimary" />
        <solid android:color="#0000"/>
        <padding android:left="2dp" android:top="2dp" android:bottom="2dp" android:right="2dp"/>
    </shape>
</inset>
Ken W.
quelle