android - 如何在android中创建一个支持所有设备的布局?

标签 android xml layout screen-resolution

这个问题可能被问了超过1000次,我仍然很困惑,哪个才是正确的方法?当我用Google搜索时,我发现了一些相关链接link1 , link2 , link3等等。我发现的解决方案是在 xml 设计中使用相对布局。所有布局都将位于布局文件夹中(如果您正在创建手机应用程序),并且尺寸应在dimens.xml中给出(位于值-mdpi,hdpi, xhdpi、xxhdpi、xxxhdpi 文件夹)支持所有屏幕。

我如何为 ImageView 提供 marginTop。我正在做这样的计算:比率 (1:1.5:2:3:4)-(mdpi:hdpi:xhdpi:xxhdpi:xxxhdpi)-(10dp-15dp-20dp-30dp-40dp)。 我的做法是否正确?

我在drawable-(mdpi:hdpi:xhdpi:xxhdpi:xxxhdpi)文件夹中给出了不同分辨率的不同图像。

我的问题在values-mdpi/dimens.xml-margintop-10dp中, value-hdpi/dimens.xml-margintop-15dp、values-xhdpi/dimens.xml-margintop-20dp 等。以(1 : 1.5 : 2 : 3 : 4)的比例给出不同屏幕的尺寸值是否正确? 在 Main.xml 中:

<RelativeLayout 
    android:id="@+id/rl_submain"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    >


    <ImageView 
        android:id="@+id/iv_papa"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="@dimen/s_mtop"
        android:background="@drawable/papa1"
        android:gravity="center"/>

    <TextView 
            android:id="@+id/tv_power"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="center_horizontal"
            android:layout_marginBottom="@dimen/s_mbot"
            android:textSize="12sp"
            android:textColor="@color/white"
            android:layout_alignParentBottom="true"
            android:text="@string/poweredby"/>

</RelativeLayout>



<resources>
<!--Splash-->mdpi
<dimen name="s_mtop">10dp</dimen>
<dimen name="s_mbot">2dp</dimen>

<resources>
<!--Splash-->hdpi
<dimen name="s_mtop">15dp</dimen>
<dimen name="s_mbot">3dp</dimen>

<resources>
<!--Splash-->xhdpi
<dimen name="s_mtop">20dp</dimen>
<dimen name="s_mbot">4dp</dimen>

 <resources>
<!--Splash-->xxhdpi
<dimen name="s_mtop">30dp</dimen>
<dimen name="s_mbot">6dp</dimen>

<resources>
<!--Splash-->xxxhdpi
<dimen name="s_mtop">40dp</dimen>
<dimen name="s_mbot">8dp</dimen>

最佳答案

how can i give marginTop for an image view.I am doing calculation like this:in ratios (1:1.5:2:3:4)-(mdpi:hdpi:xhdpi:xxhdpi:xxxhdpi)-(10dp-15dp-20dp-30dp-40dp). Whether my approach is correct or?

尺寸比 (1:1.5:2:3:4)-(mdpi:hdpi:xhdpi:xxhdpi:xxxhdpi) 是正确的,但不适用于尺寸单位 dp/dip...它适用于 px

dp :Density-independent Pixels - An abstract unit that is based on the physical density of the screen. These units are relative to a 160 dpi (dots per inch) screen, on which 1dp is roughly equal to 1px. When running on a higher density screen, the number of pixels used to draw 1dp is scaled up by a factor appropriate for the screen's dpi. Likewise, when on a lower density screen, the number of pixels used for 1dp is scaled down.

有关 different dimension unit refer doc 的更多详细信息

因此,按照您的示例,让 marginTop = 10dp 然后按照比例 (1:1.5:2:3:4)-(mdpi:hdpi:xhdpi:xxhdpi:xxxhdpi)-(10px-15px-20px- 30px-40px)
比意味着你也可以做 marginTop =10px 但它会保持 10px 。所以更高的 dpi 在这种情况下 marginTop 会看起来很小。

为了使 div/dp 优于 px,您 can refer here

sp与dp类似;但它在字体大小的上下文中使用,原因请参阅尺寸单位文档

You can also refer the converter here

dimensions should be given in dimens.xml(which is in values-mdpi,hdpi,xhdpi,xxhdpi,xxxhdpi folders) to support all screen.

再次谈到尺寸,您不应该使用值 - mdpi、hdpi...等等。因为如果您使用单位 dp,那么它与前面提到的屏幕密度无关。
如果您使用单位px,那么您可以使用values-mdpi、values-hpdi...等等,但这又会成为手动计算的开销,并且可能会因获取不需要的值而引发错误。

因此,尺寸值最好仅根据屏幕尺寸而不是屏幕密度而变化。因此您的布局或值文件夹可以按照 Android 操作系统(API)版本,屏幕尺寸如正常、大或如 link1、link2 和 Eenvicible 的评论中提到的

根据评论进行更新
如果您通过Supporting Different Screens然后你会意识到
对于布局,我们有文件夹结构layout-normal、layout-large、layout-large-land...但这可能会有所不同
在同一个链接中,你可以看到drawable-mdpi ..等等。在这里,我们使用的图像通常与密度无关,因此我们需要不同密度的相同图像,并且我们将其相应地添加到文件夹中
对于值,我们具有像值、值-fr这样的文件夹结构,以防您 Supporting Different Language
关于values-mdpi,values-hpdi我上面已经解释过了。

请正确浏览每个链接。.bcoz 我仅指官方文档

关于android - 如何在android中创建一个支持所有设备的布局?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33210975/

相关文章:

python - 在 Scrapy 中向导出的 XML 添加属性

java - 如何使用xsl :variable in xsl:choose

android - 如何显示长文本只显示 1 行并附加

layout - 在自定义控件中使用 TextFlow 时,TitledPane 未垂直调整大小

android - 将微调器添加到 ActionBar(不是导航

android - AS 找不到 BottomSheetBehavior_Params、_behavior_peekHeight 和 _behavior_hideable

安卓 NFC : can we use intent filter with mime type? (安卓 2.3.3)

Java - 如何将数据从 mysql 数据库转换为 JSON 数组?

c# - 无法使用 XDocument 查询 XML 文档并获得所需的结果

android - 在 Android 中使用 Instrumentation 进行 GUI 测试