Android在多个屏幕尺寸上使用边距

4

你好,我创建了一个应用程序,希望在多个屏幕上运行。我在HDPi上构建了整个应用程序。当我在具有更大屏幕的新型安卓手机上运行时,物品对齐就会出现问题。我知道这是因为我使用DP设置边距来定位物品。

我的问题是,在多个屏幕尺寸上使用边距的最佳实践是什么?或者是否有一些可以根据屏幕尺寸划分/乘以DP的代码?

我希望将应用程序传输到尽可能多的设备上。但这是我的第一个应用程序,不太确定如何做到这一点。因此,任何帮助都将不胜感激。

以下是我的布局示例:

<?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"/>

高分辨率屏幕(hdpi)

hdpi

超高分辨率屏幕(xhdpi)

xhdpi

1个回答

17

使用动态规划的主要目的是为了避免担心这个问题。边距在不同设备上大致相同,但如果您依赖于在特定设备分辨率/密度组合上对齐事物,那么当您在其他设备上进行测试时,您肯定会感到惊讶。

话虽如此,如果您确实需要针对不同的屏幕尺寸指定不同的边距,则只需在res/values中添加一个XML文件,例如dimens.xml

<resources
    xmlns:android="http://schemas.android.com/apk/res/android"
    >
    <dimen name="my_view_margin">10dip</dimen>
</resources>

然后为每个特定的设备限定符添加一个这样的XML文件(例如values-largevalues-sw600dpvalues-xlarge等),并根据需要修改值。当您想在布局中使用这些尺寸时,只需使用:

android:layout_margin="@dimen/my_view_margin"

而 Android 将会为运行设备选择正确的值。


你说的很有趣,因为这正是我将它们放入dp中的原因,因为我认为这就是应该做的。例如,在我的项目中,在hdpi手机上,一个文本视图对齐得很好,在xhdpi上则向左移动了。 - Luke Batley
你能提供一张截图吗? - Kevin Coppock
我已经添加了我的布局,现在只需要添加截图。 - Luke Batley
1
哦...那个有点问题(不是针对你)。你可能需要考虑使用TableLayout。首先,如果你将TextView设置为wrap_content,gravity就没有效果(因为框架的大小与内容相同)。此外,你的边距似乎相当随意,并且只能在你测试的一个屏幕上工作。我的建议是研究一下TableLayout。 - Kevin Coppock
不要误会,我宁愿做得正确。在这种情况下我该如何使用表格布局? - Luke Batley
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接