当前位置: 代码迷 >> Android >> 如何在android中创建一个应该支持所有设备的布局?
  详细解决方案

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

热度:40   发布时间:2023-08-04 10:23:55.0

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

我如何为图像视图提供 marginTop。我正在做这样的计算:in ratios (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、values-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>

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

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

dp :Density-independent Pixels - 基于屏幕物理密度的抽象单位。 这些单位相对于 160 dpi(每英寸点数)屏幕,在该屏幕上 1dp 大致等于 1px。 在更高密度的屏幕上运行时,用于绘制 1dp 的像素数会按适合屏幕 dpi 的系数放大。 同样,当在较低密度的屏幕上时,用于 1dp 的像素数会按比例缩小。

有关更多详细信息,

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

关于dip/dp优于px的优势,你

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


尺寸应在 dimens.xml(在 values-mdpi、hdpi、xhdpi、xxhdpi、xxxhdpi 文件夹中)中给出,以支持所有屏幕。

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

因此,最好dimesnion 值仅在屏幕尺寸方面而不是在屏幕密度方面有所延迟。 因此您的布局或值文件夹可以按照 Android OS(API) 版本,屏幕尺寸像正常、大或如链接 1、链接 2 和 Eenvicible 的评论中所述

基于评论的更新
如果你经历了那么你就会意识到
对于布局,我们有文件夹结构 layout-normal、layout-large、layout-large-land……但这可能会有所不同
在同一个链接中,您可以看到 drawable-mdpi.. 等等。 这里我们使用的图像通常不是密度独立的,所以我们需要不同密度的相同图像,我们相应地将其添加到文件夹中
对于值,我们有文件夹结构,如值、值-fr,以防您
关于 values-mdpi,values-hpdi 我已经在上面解释过了。

请正确浏览每个链接..bcoz 我指的只是官方文档

是的,您的 dimens.xml 文件中的值完全错误。 请删除所有不同的 dimens.xml。 当您使用图像编辑器编辑实际图像时,不同的密度适用于它们。

如果您想在图像周围留出边距,请使用带或布局的线性布局,但不要使用 dps。 加权线性布局或相对布局更加灵活。

但是,如果您确实选择了 dps,我也不建议这样做,知道在您的 dimens.xml 中设置一组测量值就足够了。

理想情况下,不要创建比您需要的更多的 xml 布局/尺寸变化。 如果需要,您可以调整它们,但在开始添加更多限定符之前,请确保您正在解决实际问题。

为什么不使用权重进行布局。 在图像上方有一个空白视图并根据您的要求对其进行加权,它将自动拉伸。 你可以在找到例子

或者像这样尝试。 根据您对空白布局的需要赋予空间权重

        <?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:orientation="vertical"
              android:layout_width="match_parent"
              android:layout_height="match_parent"
    >

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        android:weightSum="1">
    <LinearLayout
        android:orientation="horizontal"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@android:color/holo_green_dark"
        android:layout_weight="0.2"
        android:id="@+id/view1" />

    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/imageView"
       android:src="@drawable/ic_register"
        android:layout_weight="0.8"
       />
    </LinearLayout>
</RelativeLayout>
  相关解决方案