Android: Align Parent Bottom + Bottom margin

Lesezeit: 7 Minuten

Benutzer-Avatar
Jacob

Ich habe ein relatives Layout verwendet und möchte die Schaltfläche am unteren Rand des Bildschirms festlegen. Dadurch wird jedoch alles nach unten verschoben, und ich möchte einen gewissen Rand haben, sodass zwischen dem Ende des Bildschirms etwas Platz ist / Ansicht und die Schaltfläche. Was auch immer ich tue, der Rand der Schaltfläche macht aus irgendeinem Grund auf 2.1+ nichts. Das relative Layout enthält einen Hintergrund, daher kann ich nur den Rand dazu verwenden.

Kennt jemand eine Lösung dafür?

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginBottom="0dp"
android:background="@drawable/background" >

    <Button
        android:id="@+id/confirm_mobile_button_next"
        android:layout_width="fill_parent"
        android:layout_height="40dip"
        android:layout_alignParentBottom="true"
        android:layout_alignParentLeft="false"
        android:layout_centerHorizontal="false"
        android:layout_centerInParent="false"
        android:layout_margin="15dp"
        android:background="@drawable/button_shape_selector"
        android:paddingLeft="10dip"
        android:paddingRight="10dip"
        android:text="@string/confirm_mobile_no_continue"
        android:textColor="@color/white"
        android:textStyle="bold" />

</RelativeLayout>

Sie können dem RelativeLayout einfach eine Auffüllung anstelle eines Rands zum Button hinzufügen, z android:paddingBottom="15dp".

Im Allgemeinen teste ich mein Layout immer in der Exclipse-Vorschau mit der Einstellung API Level 8. Dies liefert ziemlich genaue Ergebnisse für die meisten Geräte, einschließlich ICS und JB.

  • Dies hat es für mich nicht getan, da ich MapView verwende, das den gesamten Bildschirm abdecken sollte. Ich füge einfach ein Leerzeichen hinzu TextView mit der gewünschten Höhe verwenden android:layout_alignParentBottom="true" und setzen Sie das gewünschte Objekt (Button in diesem Fall) oben.

    – cosmincalistru

    10. Januar 2013 um 12:21 Uhr


  • Diese Lösung ist nicht gültig, wenn die Textansicht/Schaltfläche einen Hintergrund hat, da ihre Größe von paddingBottom beeinflusst wird und sie schrecklich aussehen wird. Es ist besser, eine unsichtbare Ansicht unten zu platzieren

    – voghDev

    18. November 2014 um 11:58 Uhr

  • Das stimmt, @voghDev. Ich denke, der beste Rat ist zu denken über das Layout, bevor Sie zufällige Füllungen oder Ränder anwenden, da beide grundlegend unterschiedlich sind, obwohl sie oft sehr ähnliche Ergebnisse erzeugen. Hier auf Stackoverflow gibt es einen guten Artikel über die Unterschiede zwischen Padding und Margin: stackoverflow.com/questions/5958699/…. Obwohl es CSS abdeckt, gelten die gleichen Prinzipien auch für die Layout-Engine von Android.

    – André

    18. November 2014 um 17:44 Uhr

  • Das Festlegen des Abstands einer Ansicht unterscheidet sich vom Festlegen des Rands der Ansicht. Padding definiert den Abstand zwischen der Ansichtsgrenze und dem inneren Inhalt der Ansicht, während Margin den Raum definiert, der die Ansichtsgrenze umgibt. Diese Unterscheidung ist wichtig für Ansichten wie Schaltflächen und Textansichten, bei denen das Festlegen von Padding, aber nicht von Margin dazu führen kann, dass der Text in der Ansicht abgeschnitten wird. Dies würde insbesondere für die gelten Button oben definiert, da layout_height definiert sowohl Inhaltshöhe als auch Polsterung. Mehr Infos hier: stackoverflow.com/a/4619943/2326740

    – Jin

    19. März 2015 um 23:39 Uhr


  • Danke dafür! Was die Android-Quelle betrifft, scheint dies eher eine Problemumgehung als eine Lösung zu sein

    – Chucky

    29. März 2021 um 7:05 Uhr

Benutzer-Avatar
ajacian81

Die andere Sache, die Sie tun können, ist ein View das ist an der Unterseite des ausgerichtet RelativeLayoutund legen Sie seine Höhe auf den unteren Rand fest, den Sie verwenden möchten (oder geben Sie einfach einen Wert für an layout_marginBottom) so:

 <RelativeLayout
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"        
    > 
    <ImageView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:src="https://stackoverflow.com/questions/13441723/@drawable/some_image"
        android:adjustViewBounds="true"

         />
    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Some Overlay"
        android:padding="3dip"
        android:gravity="center_vertical|center_horizontal"

        android:layout_above="@+id/empty_view"
        android:layout_marginBottom="35dip"
        />
    <View 
        android:id = "@+id/empty_view"
        android:layout_height = "30dip"
        android:layout_width = "match_parent"
        android:visibility="invisible"
        android:layout_alignParentBottom="true"
        />

    </RelativeLayout>

Dieses Beispiel füllt die RelativeLayout mit dem ImageViewund Positionen a TextView über dem ImageView.

  • Listen Sie keine IDs mit a auf + mehr als einmal. Sie sollten nur verwenden @+id auf den ersten fall und dann nur verwenden @id an anderer Stelle in der XML-Datei. Also wo du hast android:id = "@+id/empty_view" nach Beginn der Polsterung View das solltest du nicht haben +

    – SDJMcHattie

    28. Januar 2014 um 11:34 Uhr

  • Verwenden Sie Leerzeichen anstelle einer unsichtbaren Ansicht

    – Saiyancoder

    26. Februar 2014 um 22:07 Uhr

  • Und auch mit einem Support-Paket veröffentlicht: developer.android.com/tools/support-library/index.html

    – Saiyancoder

    1. März 2014 um 19:00 Uhr

  • @DaveHaigh alles, was ich Ihnen im Moment anbieten kann, ist die Antwort auf diese Frage: stackoverflow.com/questions/11160954/… Die Bedeutung von + ist ein bisschen wie das Java-Schlüsselwort new. Wenn du benutzt + Mehr als einmal im XML-Code weisen Sie das System effektiv an, eine weitere neue ID zu erstellen. Ich denke, das System ist intelligent genug, um nicht wirklich ein weiteres neues zu erstellen, aber darum geht es nicht; Wenn sich das System in Zukunft ändert, würde Ihr Code brechen. Ich denke, das wird auch durch Flusen hochgezogen, wenn Sie es mit den richtigen Einstellungen einschalten.

    – SDJMcHattie

    6. August 2014 um 9:05 Uhr

Benutzer-Avatar
Schubham

Sie können das translateY-Attribut verwenden

translateY="-16dp"

Endgültiger Code

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_marginBottom="0dp"
    android:background="@drawable/background">

    <Button
        android:id="@+id/confirm_mobile_button_next"
        android:layout_width="fill_parent"
        android:layout_height="40dip"
        android:layout_alignParentBottom="true"
        android:layout_alignParentLeft="false"
        android:layout_centerHorizontal="false"
        android:layout_centerInParent="false"
        android:layout_margin="15dp"
        android:background="@drawable/button_shape_selector"
        android:paddingLeft="10dip"
        android:paddingRight="10dip"
        android:text="@string/confirm_mobile_no_continue"
        android:textColor="@color/white"
        android:textStyle="bold"
        android:translateY="-16dp" />

</RelativeLayout>

Die einzige funktionierende Lösung, die von @franny zhao vorgeschlagen wird, ist unten.

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <FrameLayout
        android:id="@+id/fl_layout"
        android:layout_alignParentBottom="true"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content">
        <TextView
            android:id="@+id/tv_layout"
            android:text="hello world"
            android:layout_marginBottom="50dp"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
    </FrameLayout>
</RelativeLayout>

Wenn Sie der unten ausgerichteten Ansicht wie von anderen vorgeschlagen eine Auffüllung hinzufügen, wird der Hintergrund der Ansicht ebenfalls erweitert. Wenn Sie einen farbigen Hintergrund haben, sieht die Ansicht so aus, als wäre sie auf den Boden geklebt. Padding und Margin sind völlig unterschiedlich, Padding ist Teil der Ansicht, aber Margin lässt Raum zwischen den Ansichten.

Ich denke, der beste Weg ist, android:layout_alignParentBottom in XML und dann in Java-Code dahinter zu setzen:

Button confirm_mobile_button_next = (Button)findViewById(R.id.confirm_mobile_button_next)

und

confirm_mobile_button_next.setTransitionY(-THE_VALUE) or setTransitionX(-THE_VALUE)

Benutzer-Avatar
sadegh saati

Ich denke, der beste Weg ist, Folgendes einzustellen:

<...
android:layout_alignParentBottom="true" />

dann im Java-Code dahinter:

Button confirm_mobile_button_next = (Button)findViewById(R.id.confirm_mobile_button_next)
confirm_mobile_button_next.setTransitionY(-THE_VALUE) or setTransitionX(-THE_VALUE)

Sie können eine ViewGroup (z. B. FrameLayout oder LinearLayout) verwenden, um die Ansicht zu umschließen. Legen Sie alignParentBottom in der äußeren ViewGroup fest, dann kann marginBottom in der inneren View arbeiten.

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <FrameLayout
        android:id="@+id/fl_layout"
        android:layout_alignParentBottom="true"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content">
        <TextView
            android:id="@+id/tv_layout"
            android:text="hello world"
            android:layout_marginBottom="50dp"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
    </FrameLayout>
</RelativeLayout>

1246400cookie-checkAndroid: Align Parent Bottom + Bottom margin

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy