草庐IT

Android 处理多个屏幕...(相对布局或线性布局)?

coder 2023-11-18 原文

我已经完成了我的应用程序,现在需要处理适应多种屏幕尺寸。

在这一点上,我唯一的选择似乎是执行以下操作:

有一个单独的 xml 布局:小、正常、大和 X 大屏幕尺寸。
在其中有一个单独的 xml 布局:ldpi、mdpi、hdpi 和 xhdpi
在其中有一个单独的 xml 布局,用于纵向和横向。

也就是说,一项 Activity 共有 32 个布局。

我只是想知道是否有更好的方法来做到这一点,因为这会非常耗时,但是如果需要支持所有可能的设备,我不会介意。

我做了一些阅读,人们说使用线性布局并使用重力,因为这是一个百分比,所以它在所有屏幕上看起来都一样。或者我可以使用RelativeLayout 并使用“AlignAbove 或Below”等。

但是我的主要问题是尺寸错误,而元素的位置似乎通常在正确的位置。

有没有一种被广泛接受的方法来做到这一点?

我真的只是在寻找普通开发人员处理所有屏幕尺寸的“主流”方式。

最佳答案

好问题。但是你这样做不是“专业”开发人员会做的。一个 Activity 不需要 32 个布局,Android 足够智能来处理事情。

Without multi-definition of layouts/multi-definition of dimens.xml multi-device support possible or not?



是的,这是绝对可能的,这就是您应该做的。 为单个 Activity 布局定义 32 个布局并不是一件好事。

假设,我在 Play 商店中有一个相当大的应用程序,有 20 多个 Activity ,现在如果我为单个 Activity 定义了 32 个布局,那么我的应用程序将有 600 多个布局。 那可行吗? 问问自己吧。

你需要先给 this非常非常好的页面阅读。它几乎包含了您需要了解的所有内容。但我会帮你把事情做好。

You do not need to provide alternative resources for every combination of screen size and density. The system provides robust compatibility features that can handle most of the work of rendering your application on any device screen, provided that you've implemented your UI using techniques that allow it to gracefully resize



这句话足以让你相信你不应该这样做。 Android 系统足够智能,可以相应地调整布局大小。 相信我,它真的很好。

As you design your UI for different screen sizes, you'll discover that each design requires a minimum amount of space. So, each generalized screen size above has an associated minimum resolution that's defined by the system. These minimum sizes are in "dp" units—the same units you should use when defining your layouts



我将尝试指出您需要考虑的一些重要事项。
  • 永远不要在布局中硬编码像素
  • 始终使用 dpsp在您的布局中。顾名思义,它们是 与不同设备的密度无关 ,所以在每个设备中看起来都一样。
  • 始终使用 wrap_contentmatch_parent用于高度和宽度
  • 永远不要使用 AbsoluteLayout
  • RelativeLayoutLinearLayout两者都适合您,您只需要根据情况决定要使用哪一种
  • 始终提供不同版本的可绘制对象 适用于不同的屏幕尺寸。这是你不能跳过的。如果你不这样做,你的布局不仅会在不同的设备上看起来很糟糕,而且会让你的应用程序消耗不必要的资源。
  • 虽然单一布局也适用于平板电脑,但由于表格的屏幕尺寸比一般手机大得多,你应该只为他们提供单独的布局。

  • Android Studio 富布局编辑器

    Android Studio 有一个很棒的布局编辑器,您可以在其中即时预览您的布局。看看下面这个截图,



    我正在以各种屏幕尺寸同时预览我的应用程序的特定屏幕和 我的布局看起来就像我想要的那样,在所有这些中 .

    对于此 Activity ,我只有两种布局,一种适用于所有手机,一种适用于所有平板电脑。

    实践经验

    如果您想要实际体验,我有一个在 Play 商店上运行的应用程序,它被成千上万的用户在 8000 多种不同屏幕尺寸的不同设备上使用。

    我只有 2 个特定 Activity 的布局 ,一种用于手机,一种用于平板电脑。我的应用程序的 UI 在所有设备上看起来都不错,我从未收到任何用户的提示。如有需要,here是应用程序的链接。

    我相信这个详细的答案可以澄清您的所有疑问,如果没有,请随时告诉我。我很乐意提供进一步的帮助。

    UDPATE

    我会再次尝试清除您的困惑。但首先我会推荐你阅读我的回答 不止一次。

    您需要一种或两种布局,这一切都取决于您正在设计的特定布局 .所有布局都与其他布局不同。 它不能在技术上被定义为它的主观性。 它没有拇指规则。但我会尽量帮助你正式。

    你需要好好利用 Android Studio 富布局编辑器 及其令人敬畏的实时预览功能。
  • 首先尝试设计针对任何平均设备尺寸(例如 5 英寸的 Nexus 5)的布局。只需选择 Nexus 5 即可预览您的布局。
  • 一旦您对设计感到满意,请选择其他屏幕尺寸进行预览。您还可以像上面的屏幕截图一样选择“预览所有尺寸”。
  • 尝试查看您的布局在所有屏幕尺寸(从 4 英寸到 10 英寸平板电脑)中是否看起来都不错。查看间距、图像大小、字体大小是否都正确。
  • 从 4 英寸到 6 英寸的所有手机通常都有完美的预览,但您可能需要为平板电脑屏幕单独设计另一种布局(因为它们足够大)。只有这里需要 2 种布局,但并非总是如此。

  • 就像在我的应用程序中一样,我有 2 个单独的布局,仅用于 5-6 个 Activity ,但对于其余的我只有一个布局。这一切都取决于特定的布局。

    设计与编程完全不同。 编程可以形式化、语法化,但设计不能 .设计绝对是主观的,取决于设计师的观点。 以自己的方式发挥创意,这就是设计的魅力 .

    关于Android 处理多个屏幕...(相对布局或线性布局)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10971535/

    有关Android 处理多个屏幕...(相对布局或线性布局)?的更多相关文章

    1. ruby-on-rails - Rails 3 中的多个路由文件 - 2

      Rails2.3可以选择随时使用RouteSet#add_configuration_file添加更多路由。是否可以在Rails3项目中做同样的事情? 最佳答案 在config/application.rb中:config.paths.config.routes在Rails3.2(也可能是Rails3.1)中,使用:config.paths["config/routes"] 关于ruby-on-rails-Rails3中的多个路由文件,我们在StackOverflow上找到一个类似的问题

    2. ruby-on-rails - 在 Ruby 中循环遍历多个数组 - 2

      我有多个ActiveRecord子类Item的实例数组,我需要根据最早的事件循环打印。在这种情况下,我需要打印付款和维护日期,如下所示:ItemAmaintenancerequiredin5daysItemBpaymentrequiredin6daysItemApaymentrequiredin7daysItemBmaintenancerequiredin8days我目前有两个查询,用于查找maintenance和payment项目(非排他性查询),并输出如下内容:paymentrequiredin...maintenancerequiredin...有什么方法可以改善上述(丑陋的)代

    3. ruby - 如何指定 Rack 处理程序 - 2

      Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack

    4. ruby-on-rails - Rails - 一个 View 中的多个模型 - 2

      我需要从一个View访问多个模型。以前,我的links_controller仅用于提供以不同方式排序的链接资源。现在我想包括一个部分(我假设)显示按分数排序的顶级用户(@users=User.all.sort_by(&:score))我知道我可以将此代码插入每个链接操作并从View访问它,但这似乎不是“ruby方式”,我将需要在不久的将来访问更多模型。这可能会变得很脏,是否有针对这种情况的任何技术?注意事项:我认为我的应用程序正朝着单一格式和动态页面内容的方向发展,本质上是一个典型的网络应用程序。我知道before_filter但考虑到我希望应用程序进入的方向,这似乎很麻烦。最终从任何

    5. ruby - 多个属性的 update_column 方法 - 2

      我有一个具有一些属性的模型:attr1、attr2和attr3。我需要在不执行回调和验证的情况下更新此属性。我找到了update_column方法,但我想同时更新三个属性。我需要这样的东西:update_columns({attr1:val1,attr2:val2,attr3:val3})代替update_column(attr1,val1)update_column(attr2,val2)update_column(attr3,val3) 最佳答案 您可以使用update_columns(attr1:val1,attr2:val2

    6. ruby-on-rails - 在 ruby​​ .gemspec 文件中,如何指定依赖项的多个版本? - 2

      我正在尝试修改当前依赖于定义为activeresource的gem:s.add_dependency"activeresource","~>3.0"为了让gem与Rails4一起工作,我需要扩展依赖关系以与activeresource的版本3或4一起工作。我不想简单地添加以下内容,因为它可能会在以后引起问题:s.add_dependency"activeresource",">=3.0"有没有办法指定可接受版本的列表?~>3.0还是~>4.0? 最佳答案 根据thedocumentation,如果你想要3到4之间的所有版本,你可以这

    7. ruby - 使用多个数组创建计数 - 2

      我正在尝试按0-9和a-z的顺序创建数字和字母列表。我有一组值value_array=['0','1','2','3','4','5','6','7','8','9','a','b','光盘','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','','u','v','w','x','y','z']和一个组合列表的数组,按顺序,这些数字可以产生x个字符,比方说三个list_array=[]和一个当前字母和数字组合的数组(在将它插入列表数组之前我会把它变成一个字符串,]current_combo['0','0','0']

    8. ruby-on-rails - before_filter 运行多个方法 - 2

      是否有可能:before_filter:authenticate_user!||:authenticate_admin! 最佳答案 before_filter:do_authenticationdefdo_authenticationauthenticate_user!||authenticate_admin!end 关于ruby-on-rails-before_filter运行多个方法,我们在StackOverflow上找到一个类似的问题: https://

    9. ruby - nanoc 和多种布局 - 2

      是否可以为特定(或所有)项目使用多个布局?例如,我有几个项目,我想对其应用两种不同的布局。一个是绿色的,一个是蓝色的(但是)。我想将它们编译到我的输出目录中的两个不同文件夹中(例如v1和v2)。我一直在玩弄规则和编译block,但我不知道这是怎么回事。因为,每个项目在编译过程中只编译一次,我不能告诉nanoc第一次用layout1编译,第二次用layout2编译。我试过这样的东西,但它导致输出文件损坏。compile'*'doifitem.binary?#don’tfilterbinaryitemselsefilter:erblayout'layout1'layout'layout2'

    10. ruby-on-rails - Rails 3.1 中具有相同形式的多个模型? - 2

      我正在使用Rails3.1并在一个论坛上工作。我有一个名为Topic的模型,每个模型都有许多Post。当用户创建新主题时,他们也应该创建第一个Post。但是,我不确定如何以相同的形式执行此操作。这是我的代码:classTopic:destroyaccepts_nested_attributes_for:postsvalidates_presence_of:titleendclassPost...但这似乎不起作用。有什么想法吗?谢谢! 最佳答案 @Pablo的回答似乎有你需要的一切。但更具体地说...首先改变你View中的这一行对此#

    随机推荐