it-swarm.com.de

Ist es eine schlechte Praxis, negative Ränder in Android zu verwenden?

Demo der negativen Marge:

 enter image description here 

Das Szenario

Überlappende Ansichten, indem Sie einen negativen Rand auf eine davon setzen, sodass er in den Begrenzungsrahmen einer anderen Ansicht übergeht.

Gedanken

Es scheint so zu funktionieren, wie Sie es von einer Überlappung der Layouts erwarten. Aber ich möchte nicht auf ein größeres Problem stoßen, weil ich die Dinge unwissentlich nicht richtig gemacht habe. Emulatoren, physische Geräte, wie Sie es nennen, wenn Sie negative Ränder verwenden, scheint alles korrekt zu funktionieren, eine Ansicht überfällt den Begrenzungsrahmen einer anderen Ansicht und ist abhängig davon, wie sie im Layout deklariert ist, über oder unter der anderen Ansicht.

Mir ist auch bewusst, dass wir seit API 21 die Attribute translationZ und elevation so einstellen können, dass die Ansicht über oder unter anderen Ansichten angezeigt wird, abermein Anliegenkommt im Wesentlichen von der Tatsache, dass in der Dokumentation für die layout_margin-Attribute eindeutig festgelegt ist, dassRandwerte positiv sein sollen, lassen Sie mich Folgendes zitieren:

Auszug:
Gibt zusätzlichen Platz auf der linken, oberen, rechten und unteren Seite dieser Ansicht an. Dieser Raum liegt außerhalb der Grenzen dieser Ansicht.Margin-Werte sollten positiv sein. Muss ein Dimensionswert sein. Dies ist eine Gleitkommazahl, an die eine Einheit wie "14.5sp" angehängt wird. Verfügbare Einheiten sind: px (Pixel), dp (dichteunabhängige Pixel), sp (skalierte Pixel basierend auf der bevorzugten Schriftgröße), in (Zoll), mm (Millimeter) ...

In den Jahren, in denen ich diese Frage ursprünglich gestellt habe, hatte ich keine Probleme mit negativen Rändern. Ich habe versucht, sie so weit wie möglich zu vermeiden, aber es gabnotProbleme, obwohl die Dokumentation besagt, dass ich nicht zu besorgt bin.

101
Juan Cortés

Im Jahr 2010 gab @RomainGuy (Android-Kerntechniker) an, dass negative Margen nicht näher spezifiziert waren .

Im Jahr 2011 gab @RomainGuy an, dass Sie negative Margen für LinearLayout und RelativeLayout verwenden können.

2016 gab @RomainGuy an, dass sie nie offiziell unterstützt wurden und nicht von ConstraintLayout unterstützt werden. 

Es ist jedoch leicht, diese Einschränkung zu umgehen. 

Fügen Sie am unteren Rand Ihrer Basisansicht eine Hilfsansicht hinzu (Höhe 0 dB, Breite an das übergeordnete Element gebunden), und fügen Sie am unteren Rand den gewünschten Rand hinzu.
Positionieren Sie dann Ihre Ansicht unter diese Sicht, so dass sie eine "negative" Marge hat, ohne jedoch einen nicht unterstützten negativen Wert verwenden zu müssen. 

166
CommonsWare

Wenn Sie einen negativen Rand verwenden möchten, setzen Sie ausreichend Abstand für den Container und dessen clipToPadding auf false und den negativen Rand für die untergeordneten Elemente, damit die untergeordnete Ansicht nicht beschnitten wird!

14
Ali

Hoffe das hilft jemandem. Hier ist ein Beispielcode, der ConstraintLayout basierend auf der Antwort von @ CommonsWare verwendet:

Fügen Sie eine Helper-Ansicht (Höhe 0dp, Breite, die an das übergeordnete Element gebunden ist) am .__ hinzu. Fügen Sie unten in der Basisansicht den gewünschten Rand hinzu. Dann Positionieren Sie Ihre Ansicht unter diesem, so dass effektiv ein "negative" Marge, jedoch ohne dass ein nicht unterstütztes negatives .__ verwendet werden muss. Wert.

Beispielcode:

<TextView
    Android:id="@+id/below"
    Android:layout_width="match_parent"
    Android:layout_height="wrap_content"
    Android:background="#F1B36D"
    Android:padding="30dp"
    Android:text="I'm below"
    Android:textColor="#ffffff"
    Android:textSize="48sp"
    Android:textAlignment="center"
    tools:layout_editor_absoluteX="129dp"
    tools:layout_editor_absoluteY="0dp" />

<Android.support.v4.widget.Space
    Android:id="@+id/space"
    Android:layout_width="0dp"
    Android:layout_height="0dp"
    Android:layout_marginBottom="32dp"
    app:layout_constraintBottom_toBottomOf="@+id/below"
    app:layout_constraintLeft_toLeftOf="@id/below"
    app:layout_constraintRight_toRightOf="@id/below" />

<TextView
    Android:id="@+id/top"
    Android:layout_width="100dp"
    Android:layout_height="60dp"
    Android:textAlignment="center"
    Android:textColor="#ffffff"
    Android:text="I'M ON TOP!"
    Android:background="#676563"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintRight_toRightOf="parent"
    app:layout_constraintTop_toBottomOf="@+id/space" />

Ausgabe:

 enter image description here

5
VicJordan

In der Vergangenheit war dies möglicherweise eine schlechte Praxis, aber mit Material Design und seinen schwebenden Aktionsschaltflächen scheint es in vielen Fällen unvermeidlich und erforderlich zu sein. Wenn Sie über zwei separate Layouts verfügen, die Sie nicht in ein einzelnes RelativeLayout einfügen können, da sie eindeutig voneinander getrennt behandelt werden müssen (z. B. Header und Inhalt), können Sie die FAB nur überlappen, wenn sie aus einem dieser Elemente herausfallen Layouts mit negativen Rändern. Und dies schafft zusätzliche Probleme mit anklickbaren Bereichen.

4
Gábor

Für mich und hinsichtlich der Einstellung einer negativen Marge für ein TextView (ich weiß, dass das OP sich auf eine ViewGroup bezieht, aber ich habe nach Problemen mit der Einstellung negativer Margen gesucht und bin hier gelandet) ... Ich fand ein Problem mit 4.0.3 ( API 15) NUR und die Einstellung von Android:layout_marginTop oder Android:layout_marginBottom auf einen negativen Wert wie -2dp.

Aus irgendeinem Grund wird die Textansicht überhaupt nicht angezeigt. Es scheint aus der Sicht "weg" zu sein (nicht nur unsichtbar).

Als ich dies mit den anderen 3 Versionen von layout_margin ausprobierte, konnte ich das Problem nicht sehen.

Beachten Sie, dass ich dies nicht auf einem echten Gerät probiert habe. Es wird ein 4.0.3-Emulator verwendet. Dies ist die zweite merkwürdige Sache, die ich gefunden habe, die nur 4.0.3 betroffen hat, also ist meine neue Regel dazu immer teste mit einem Emulator 4.0.3 :)

Ich habe Erfolg mit der Reduzierung des unteren Randes eines TextView durch Verwendung von Android:lineSpacingExtra="-2dp", was auch dann funktioniert, wenn ich Android:singleLine="true" habe (und daher hätte ich nicht gedacht, dass der Zeilenabstand ein Faktor wäre).

3
GaryAmundson

Nein, Sie sollten negative margin nicht verwenden. Verwenden Sie stattdessen translate. Selbst wenn ein negativer Rand einmal funktioniert, wenn Sie das Layout programmierbar ändern, hilft Übersetzen. Die Ansicht kann nicht über den Bildschirm laufen, wenn Sie den Rand verwenden.

1
Cheung Sean

Ich wusste nur, dass dies für eine kurze Zeit möglich war. Aber ich sehe kein Problem damit. Achten Sie einfach auf die Bildschirmgröße und solche, damit Sie nicht versehentlich Elemente erstellen, die nicht überlappend auf dem Bildschirm erscheinen sollten. (d. h. Text über Text ist wahrscheinlich eine schlechte Idee.)

0
FoamyGuy