Saurabh Nanda
Saurabh Nanda

Reputation: 6793

RelativeLayout: layout_marginLeft inconsistent behaviour

Context: I have a widget which basically consists of a RelativeLayout wrapping a bunch of TextViews. Here's what I want the widget to visually look like, followed by the the XML Layout code:

Expected layout

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 
   xmlns:android="http://schemas.android.com/apk/res/android"
   android:id="@+id/alarm_widget_layout"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   >
  <TextView
     android:id="@+id/alarm_time"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:layout_centerHorizontal="true"
     android:text="8:30"
     android:textSize="40sp"
     />
  <TextView
     android:id="@+id/alarm_am_pm"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:layout_toRightOf="@id/alarm_time"
     android:layout_marginLeft="2dp"
     android:layout_alignTop="@id/alarm_time"
     android:textSize="18sp"
     android:text="AM"
     />
  <TextView
     android:id="@+id/alarm_days"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:layout_centerHorizontal="true"
     android:layout_below="@id/alarm_time"
     android:textSize="16sp"
     android:text="M T W T F S S"
     />
  <TextView
     android:id="@+id/toggle_indicator"
     android:layout_height="8sp"
     android:layout_width="80sp"
     android:layout_below="@id/alarm_days"
     android:layout_centerHorizontal="true"
     android:background="@drawable/toggle_button_oval"
     />
</RelativeLayout>

Question: I'm stumped with the inconsistent behaviour of layout_marginLeft in the following scenarios:

  1. When these widgets are stacked vertically inside a LinearLayout, the AM/PM text in the top-right requires android:layout_marginLeft="15dp" to look like it does in the picture above.
  2. However, when the widgets are stacked in a 2x2 TableLayout, the AM/PM text requires android:layout_marginLeft="2dp" to look correct.

Why am I seeing this inconsistent behaviour? What does layout_marginLeft use as it's "origin"?

Upvotes: 1

Views: 753

Answers (1)

Saurabh Verma
Saurabh Verma

Reputation: 6728

Since you are using a vertical LinearLayout (orientation = vertical), android:layout_marginLeft will take the extreme left of the screen as origin, thereby requiring a large dip value ~15. However, if you would have been using orientation = horizontal, the origin would be the end of the element just before your am_pm, and hence you would require a smaller dip value ~2. Similar is the case with Relative nd Tabular Layout. Since while using RelativeLayout, you have mentioned android:layout_toRightOf="@id/alarm_time", the origin will be the end of alarm_time, thereby requiring a smaller dip value.

Upvotes: 1

Related Questions