创建特定于设备的自定义Android布局

时间:2017-09-11 19:37:55

标签: android android-layout

我的公司在Android设备上预装了一个Android应用程序,用于我们制作的一些工业生产设备。我们有"电话"和平板电脑"格式设备,不同分辨率的设备,区域设置等。因此,我熟悉为" layout"设置不同的xml文件夹。 " layout-land"," drawable-hdpi"," drawable-mdpi&#34 ;;的不同图像资源; " values-ru",values-ro"等的不同语言资源

现在我们有一位客户希望我们在他们自己的有点奇怪的宽高比和分辨率的Android设备上加载我们的应用程序,他们将为我们提供,所以我想为该设备制作自定义布局。

假设我创建一个名为" layout-custom1"的布局文件夹,如何告诉我的代码使用那个布局文件夹而不是默认为常规布局或布局-land文件夹? 我想在我的代码中只在一个地方执行此操作,因为我们的应用程序有多个屏幕/活动,我更喜欢在调用每个 setContentView之前不必执行此操作)

关于这个问题,我可以在Java中打电话询问我在运行什么设备?

编辑:我更愿意避免使用不同的APK,因为这对我们的制作人员来说会很头疼。

2 个答案:

答案 0 :(得分:1)

  

假设我创建一个名为“layout-custom1”的布局文件夹

我认为这会导致构建错误。如果没有,它应该,因为你不能发明新的资源集限定符。

  

我们有一个客户希望我们的应用程序版本为他们自己有点奇怪的宽高比和分辨率的Android设备,所以我想为该设备制作自定义布局

理想情况下,找一些覆盖该设备的现有资源集限定符,但不包含您支持的其他设备。

或者,使用产品口味:

  • 为此客户创建一个,为其他人创建一个(空)

  • 根据客户特定的风格

  • 覆盖资源
  • 将客户特定风味的APK分发给该客户,将其他风味分发给其他人

否则,您几乎无法修改每个setContentView()调用,以便在此客户的设备上运行时使用特定于客户的资源。您可以通过公共资源ID调配实用程序方法进行一些简化,该方法需要R.layout.foo并为客户的设备返回R.layout.foo_funky,并为所有其他设备返回R.layout.foo。然后,将setContentView(R.layout.foo)来电修改为setContentView(swizzler(R.layout.foo))

答案 1 :(得分:0)

如果您可以将另外一个apk部署到此特定设备,则可以使用运行时资源覆盖https://developer.sonymobile.com/2014/04/22/sony-contributes-runtime-resource-overlay-framework-to-android-code-example/)来创建仅包含必要布局的apk(使用相同的ID) ),没有代码。

只接受安装在/ vendor / overlay中的叠加层,一个只能由设备供应商编写的目录(这是您的情况),因此您不应该遇到此问题。

另外,请记住使用相同的签名证书

如链接所述:

运行时资源重叠挂钩到资源查找框架,隐藏现有值或为新配置添加值。应用程序使用的资源接口未更改,因此应用程序不知道当前正在应用RRO,就像应用程序当前不知道其不同的资源配置一样。因此,应用程序可以利用RRO 而无需任何源代码修改

RRO的一个关键组件是叠加套餐。这些包包含一个或多个应用程序资源的备用版本。任何应用程序都可以通过一个或多个覆盖包修改其资源。覆盖包仅影响单个应用程序,在此上下文中,应用程序称为覆盖的目标包。

Resource lookup, multiple overlays. The overlays are searched based on their priorities. The target package is always searched last.