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



我的公司寄出了预装在Android设备上的Android应用程序,可与我们制造的某些工业生产设备一起使用。我们既有"电话"one_answers"平板电脑"格式设备,不同分辨率的设备,语言环境等","可绘制的mdpi";" values-ru",value-ro"等的不同语言资源

现在,我们有一个客户希望我们以自己的某种奇怪的expact-Ratio和分辨率Android设备加载应用程序,他们将为我们提供,因此我想为该设备制作自定义布局。p>假设我制作了一个名为" Layout-custom1"的布局文件夹,我该如何告诉我的代码布局文件夹而不是默认为常规布局或布局 - 地带文件夹?我想在我的代码中的一个地方做到这一点,因为我们的应用程序具有数十亿个屏幕/活动,我宁愿在调用每个 setContentView()。

关于该主题,我可以在Java中询问我正在运行的设备的电话?

编辑:我宁愿避免拥有不同的APK,因为这将使我们的生产人员头痛。

假设我制作了一个名为" layout-custom1"的布局文件夹

我认为这将导致构建错误。如果不是,则应该,因为您无法发明新的资源设置预选赛。

我们有一个客户想要我们自己的应用程序的版本,以便他们自己的某种奇怪的expact-aptip-ratio和分辨率Android设备,因此我想为该设备制作自定义布局

理想情况下,找到一些现有的资源集限定符,可以涵盖该设备,但没有您支持的其他设备。

或使用产品口味:

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

  • 在特定于客户风味的情况下根据需要覆盖资源

  • 将特定于客户的风味的apk分发给该客户,其他口味向其他所有人

否则,您几乎可以修改每个setContentView()调用,在此客户的设备上运行时使用特定于客户的资源。您可以通过公共资源ID Swizzling Utility方法简化该方法,该方法采用R.layout.foo并为客户的设备返回R.layout.foo_funky,而R.layout.foo则用于所有其他设备。然后,将setContentView(R.layout.foo)调用为setContentView(swizzler(R.layout.foo))

如果您可以将另一个APK部署到此特定设备,则可以使用 Runtime Resource Resource覆盖(https://developer.sonymobile.com/2014/04/22/sony-contributes-runtime-runtime-runtlay-reverlay-framework-to android-code-example/)仅创建一个仅包含必要布局(使用相同IDS)的APK,而没有代码。

仅在/供应商/覆盖中安装的叠加层,即仅由设备供应商写入的目录(您的情况),因此您不应该对此有任何问题。

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

如链接上所述:

运行时资源覆盖挂钩进入资源查找框架,阴影现有值或为新配置添加值。应用程序使用的资源界面没有变化,因此应用程序不知道当前应用RRO,就像应用程序当前不知道其不同的资源配置一样。因此,应用程序可以利用RRO 而无需任何源代码修改

RRO的关键组件是覆盖套件。这些软件包包含一个或多个应用程序资源的替代版本。任何应用程序都可以通过一个或多个覆盖软件包修改其资源。一个覆盖软件包仅影响一个应用程序,在这种情况下,该应用称为"覆盖目标软件包"。

资源查找,多个叠加层。根据其优先级搜索覆盖层。目标包总是最后搜索。

最新更新