Reputation: 2402
Hi I have created an app that i want to run across multiple screens i built the whole thing at HDPi. and when I run it on a newer android phone with a bigger screen the alignment of stuff is out. I know this is because i have set margins to position things using DP.
My question is whats the best practices for using margins across multiple screen sizes and/or is there some code that I can set that can divide/multiply the DP based on screen size?
I'm wanting to get the app across as many devices as possible. but this is my first app so not entirely sure how to do this. So any help would be greatly appreciated.
heres an example of my layout
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="20dip"
android:background="@drawable/bg_tablecell"
android:orientation="horizontal"
android:weightSum="1"
>
<TextView
android:id="@+id/position"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_centerVertical="true"
android:paddingLeft="4dip"
android:text="@string/POS"
android:textSize="15dip"
android:textColor="@color/blue"
/>
<TextView
android:id="@+id/TeamName"
android:layout_width="90dip"
android:layout_height="wrap_content"
android:layout_marginLeft="23dip"
android:ellipsize="end"
android:gravity="left"
android:lines="1"
android:text="@string/Team"
android:textColor="@color/blue"
android:textSize="15dip"
android:textStyle="bold"
android:layout_centerVertical="true"/>
<TextView
android:id="@+id/played"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBaseline="@+id/TeamName"
android:layout_alignBottom="@+id/TeamName"
android:layout_marginLeft="35dip"
android:layout_toRightOf="@+id/TeamName"
android:gravity="center"
android:text="@string/Zero"
android:textColor="@color/blue"
android:textSize="10dip"
android:layout_centerVertical="true"/>
<TextView
android:id="@+id/won"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBaseline="@+id/played"
android:layout_alignBottom="@+id/played"
android:layout_marginLeft="17dip"
android:layout_toRightOf="@+id/played"
android:gravity="center"
android:text="@string/Zero"
android:textColor="@color/blue"
android:textSize="10dip"
android:layout_centerVertical="true"/>
<TextView
android:id="@+id/drawn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBaseline="@+id/won"
android:layout_alignBottom="@+id/won"
android:layout_marginLeft="16dip"
android:layout_toRightOf="@+id/won"
android:gravity="center"
android:text="@string/Zero"
android:textColor="@color/blue"
android:textSize="10dip"
android:layout_centerVertical="true"/>
<TextView
android:id="@+id/lost"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBaseline="@+id/drawn"
android:layout_alignBottom="@+id/drawn"
android:layout_marginLeft="16dip"
android:layout_toRightOf="@+id/drawn"
android:gravity="center"
android:text="@string/Zero"
android:textColor="@color/blue"
android:textSize="10dip"
android:layout_centerVertical="true"/>
<TextView
android:id="@+id/goalsFor"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBaseline="@+id/lost"
android:layout_alignBottom="@+id/lost"
android:layout_marginLeft="16dip"
android:layout_toRightOf="@+id/lost"
android:gravity="center"
android:text="@string/Zero"
android:textColor="@color/blue"
android:textSize="10dip"
android:layout_centerVertical="true"/>
<TextView
android:id="@+id/goalsAgainst"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBaseline="@+id/goalsFor"
android:layout_alignBottom="@+id/goalsFor"
android:layout_marginLeft="17dip"
android:layout_toRightOf="@+id/goalsFor"
android:gravity="center"
android:text="@string/Zero"
android:textColor="@color/blue"
android:textSize="10dip"
android:layout_centerVertical="true"/>
<TextView
android:id="@+id/Difference"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBaseline="@+id/goalsAgainst"
android:layout_alignBottom="@+id/goalsAgainst"
android:layout_marginLeft="15dip"
android:layout_toRightOf="@+id/goalsAgainst"
android:gravity="center"
android:text="@string/Zero"
android:textColor="@color/blue"
android:textSize="10dip"
android:layout_centerVertical="true"/>
<TextView
android:id="@+id/points"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBaseline="@+id/Difference"
android:layout_alignBottom="@+id/Difference"
android:layout_marginLeft="18dip"
android:layout_toRightOf="@+id/Difference"
android:gravity="center"
android:text="@string/Zero"
android:textColor="@color/blue"
android:textSize="10dip"
android:layout_centerVertical="true"/>
screens hdpi
screens xhdpi
Upvotes: 4
Views: 12623
Reputation: 134694
Well the whole point of using DP is so that you don't have to worry about this. Margins will be roughly the same across devices, but if you're relying on lining things up on one particular device resolution/density combination, you'll definitely be in for a surprise when you test on other devices.
That said, if you do need to specify different margins for different screen sizes, simply add an XML file in res/values
-- something like dimens.xml
:
<resources
xmlns:android="http://schemas.android.com/apk/res/android"
>
<dimen name="my_view_margin">10dip</dimen>
</resources>
Then add one of these XMLs for every specific device qualifier that you need to (e.g. values-large
, values-sw600dp
, values-xlarge
, etc.) and modify the value as you see fit. When you want to use these dimensions in a layout, just use:
android:layout_margin="@dimen/my_view_margin"
And Android will pick the correct value for whatever device it happens to be running on.
Upvotes: 17