【问题标题】:How to create a layout in android which should support all the devices?如何在android中创建一个应该支持所有设备的布局?
【发布时间】:2015-10-19 09:28:11
【问题描述】:

这个问题可能会被问超过 1000 次,我仍然很困惑,这将是正确的方法?当我用谷歌搜索时,我发现了一些相关链接link1,link2,link3 等。我的解决方案是什么发现是在 xml 设计中使用相对布局。所有布局都将在布局文件夹中(如果您正在创建手机应用程序),尺寸应在 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>

【问题讨论】:

  • 您是否考虑过为不同的屏幕尺寸创建资源?例如 layout-sw300dp、layoutsw400dp、layout-sw600dp?布局-sw800dp?那么很容易看出600和800覆盖平板
  • @murugalonger 我认为这个问题与从 drawables 文件夹加载图像无关;它是关于在布局中支持所有屏幕尺寸/设备
  • @murugalonger..我在这里问,我的方法是否正确。?
  • 我的方法是否正确?不,不是……很难理解你的问题出在哪里……但是……如果你使用 dp 你不应该依赖 dpi 的大小......它是自动完成的......你可以让边距取决于“设备类型”,正如 Eenvincible 在他的第一条评论中所说的那样

标签: android xml layout screen-resolution


【解决方案1】:

如何为图像视图提供 marginTop。我正在做类似的计算 这:在比率 (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 缩小。

有关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 看起来很小..

为了获得 dip/dp 优于 px 的优势,你 can refer here

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

You can also refer the converter here

尺寸应该在dimens.xml中给出(在 values-mdpi,hdpi,xhdpi,xxhdpi,xxxhdpi 文件夹)支持全屏。

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

因此,dimesnion 值最好仅根据屏幕尺寸而不是根据屏幕密度来延迟。因此您的布局或值文件夹可以根据 Android 操作系统 (API) 版本,屏幕尺寸与正常、大或在链接 1、链接 2 和 Eenvicible 的评论中提到的一样

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

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

【讨论】:

  • 我已经浏览了所有链接,转换器在这里非常有用。但在这里仍然感到困惑。只有这样我才能通过 net.helpless..
  • 但是让你困惑的是什么......从你的问题我可以看出你不知道 dp 和 px 之间的区别,所以基于我的回答
  • 我在 dimens.xml 中给出的值是错误的?那么我在这里做错了什么?那么最好的方法是什么?
  • @AsifSb 请检查更新后的答案...关于您在尺寸中给出的值是可以接受的,但在所有设备上并不一致...因为您使用了不同的单位 dp 值
  • @AsifSb 希望它能消除您的疑虑...如果仍然令人困惑,请告诉我
【解决方案2】:

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

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

但如果你确实选择了 dps,我不建议你再次选择,知道在你的 dimens.xml 中的一组测量值就足够了。

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

【讨论】:

  • 我想你明白了我在这里想说的话..谢谢。
  • @stephen...U 给了我完美的解决方案,但 ShadowDroid 给了我很好的解释..
【解决方案3】:

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

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

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

【讨论】:

  • 我使用了相对布局。请检查我编辑的问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-08-08
  • 1970-01-01
  • 2019-03-14
  • 2012-03-17
  • 2011-07-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多