Ist es eine schlechte Praxis, negative Margen in Android zu verwenden?

Demo der negativen Marge:

Bildbeschreibung hier eingeben

Das Szenario

Überlappende Ansichten, indem Sie einen negativen Rand auf einen von ihnen setzen, so dass er in den Begrenzungsrahmen einer anderen Ansicht eindringt.

Gedanken

Es scheint so zu funktionieren, wie Sie es erwarten würden, wenn sich die Layouts überlappen würden. Aber ich möchte nicht auf ein größeres Problem stoßen, weil ich unwissentlich die Dinge nicht richtig mache. Emulatoren, physische Geräte, Sie nennen es, wenn Sie negative Ränder verwenden, scheint alles korrekt zu funktionieren, eine Ansicht dringt in die Begrenzungsbox einer anderen Ansicht ein und abhängig davon, wie sie im Layout deklariert wird, wird sie über oder unter der anderen Ansicht liegen.

Mir ist auch bewusst, dass seit API 21 die Attribute translationZ und layout_margin werden können, dass die Ansicht über oder unter anderen Ansichten erscheint, aber meine Bedenken layout_margin im layout_margin darauf, dass in der Dokumentation für die layout_margin Attribute eindeutig festgelegt ist, dass die Margin-Werte angegeben werden sollten positiv , lassen Sie mich zitieren:

Auszug:
Gibt zusätzlichen Platz auf der linken, oberen, rechten und unteren Seite dieser Ansicht an. Dieser Bereich befindet sich außerhalb der Grenzen dieser Ansicht. Randwerte sollten positiv sein . Muss ein Dimensionswert sein, bei dem es sich um eine Fließkommazahl handelt, an die eine Einheit wie “14.5sp” angehängt ist. 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, seit ich diese Frage gestellt habe, hatte ich keine Probleme mit negativen Margen, habe versucht, sie so weit wie möglich zu vermeiden, aber es gab keine Probleme, und obwohl das in der Dokumentation steht, bin ich es auch nicht besorgt darüber.

   

Im Jahr 2010 erklärte @RomainGuy (Core-Android-Ingenieur), dass negative Margen ein nicht spezifiziertes Verhalten hatten .

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

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

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

Fügen Sie am unteren Rand der Basisansicht eine Hilfsansicht hinzu (Höhe 0 Pixel, Breite beschränkt auf übergeordnete Elemente), fügen Sie am unteren Rand den gewünschten Rand hinzu.
Positionieren Sie Ihre Ansicht dann unterhalb dieser Position und lassen Sie effektiv einen “negativen” Rand zu, ohne jedoch einen nicht unterstützten negativen Wert zu verwenden.

Wenn Sie den negativen Rand verwenden möchten, legen Sie genügend Auffüllung für den Container und dessen ClipToPadding auf false fest und legen Sie einen negativen Rand für die untergeordneten Elemente fest , damit die untergeordnete Ansicht nicht abgeschnitten wird!

Es mag in der Vergangenheit eine schlechte Übung gewesen sein, aber mit Material Design und seinen schwebenden Aktionsknöpfen scheint es in vielen Fällen jetzt unvermeidlich und erforderlich zu sein. Wenn Sie zwei separate Layouts haben, die Sie nicht in ein einzelnes RelativeLayout einfügen können, weil sie eine deutlich getrennte Handhabung benötigen (denken Sie zum Beispiel an Header und Inhalt), besteht die einzige Möglichkeit, den FAB zu überlappen, darin, dass er aus einem solchen herausragt Layouts mit negativen Rändern. Und dies erzeugt zusätzliche Probleme mit anklickbaren Bereichen.

Für mich und in Bezug auf die Einstellung einer negativen Marge auf einem TextView (ich weiß, das OP bezieht sich auf eine ViewGroup, aber ich suchte nach Problemen mit negativen Margen setzen und ich landete hier) … Ich habe 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 TextView überhaupt nicht angezeigt. Es scheint aus der Sicht “verschwunden” zu sein (nicht nur unsichtbar).

Als ich dies mit den anderen 3 Versionen von layout_margin versuchte, sah ich das Problem nicht.

Beachten Sie, dass ich dies nicht auf einem echten Gerät ausprobiert habe, das verwendet einen 4.0.3 Emulator. Dies ist die zweite seltsame Sache, die ich gefunden habe, dass nur 4.0.3 betroffen ist, also ist meine neue Regel, immer mit einem 4.0.3 Emulator zu testen 🙂

Ich habe Erfolg mit der Verringerung der unteren Rand eines TextView mit android:lineSpacingExtra="-2dp" was funktioniert, obwohl ich zufällig android:singleLine="true" (und so hätte ich nicht gedacht, dass Zeilenabstand wäre ein Faktor).

Hoffe, das wird jemandem helfen. Hier wird der Beispielcode mit ConstraintLayout basierend auf der @ CommonsWare-Antwort verwendet:

Fügen Sie am unteren Rand der Basisansicht eine Hilfsansicht hinzu (Höhe 0 Pixel, Breite beschränkt auf übergeordnete Elemente), fügen Sie am unteren Rand den gewünschten Rand hinzu. Positionieren Sie Ihre Ansicht dann unterhalb dieser Position und lassen Sie effektiv einen “negativen” Rand zu, ohne jedoch einen nicht unterstützten negativen Wert zu verwenden.

Beispielcode:

    

Ausgabe:

Bildbeschreibung hier eingeben

Nein, Sie sollten keine negative margin . Stattdessen sollten Sie translate . Selbst wenn der negative Rand irgendwann funktioniert, wenn Sie das Layout programmierbar ändern, würde translate helfen. Und die Ansicht kann den Bildschirm nicht überlaufen, wenn Sie Rand verwenden.

Ich wusste nur, dass es für eine ziemlich kurze Zeit möglich war. Aber ich sehe kein Problem damit. Achten Sie nur auf die Bildschirmgrößen und so, dass Sie sicher sind, dass Sie nicht versehentlich auf Elemente treffen, die nicht überlappend auf dem Bildschirm erscheinen sollen. (dh Text über dem Text ist wahrscheinlich eine schlechte Idee.)