Android:能否通过资源限定符拆分src文件夹?
Android Flavor结合横竖屏限定符拆分源码目录的解决方案
方案可行性结论
完全可行,Android官方支持在**Product Flavor维度结合配置限定符(如横竖屏)**来组织源码与资源目录,编译时会根据当前设备的配置自动匹配对应的代码。
具体实现步骤
针对你的flavor2场景,可按以下方式配置:
创建带限定符的Flavor源码目录
为flavor2分别创建横竖屏专属的源码目录,目录命名遵循flavorName-限定符规则:src/flavor2-land/java/:存放横屏版AE生成的Java类(对应WIDTH=1920的版本)src/flavor2-port/java/:存放竖屏版AE生成的Java类(对应WIDTH=1080的版本)
关键要求:两个目录下的Java类必须保持完全相同的包名和类名,这样编译时才会根据设备横竖屏状态自动替换加载。
确认Gradle配置(无需额外修改)
只要你的Product Flavor基础配置正确,Android Gradle插件会自动识别带限定符的Flavor目录,示例基础配置:android { flavorDimensions "version" productFlavors { flavor1 { dimension "version" } flavor2 { dimension "version" } } }验证效果
构建flavor2的变体(如flavor2Debug)后,旋转设备:- 横屏时,App会加载
flavor2-land下的Java类,使用WIDTH=1920 - 竖屏时,自动切换为
flavor2-port下的类,使用WIDTH=1080
- 横屏时,App会加载
替代方案(无需拆分源码)
如果觉得拆分目录过于繁琐,可将固定尺寸参数迁移到资源文件中,避免生成多版本Java类:
- 在
res/values/和res/values-land/下分别创建尺寸资源:<!-- res/values/dimens.xml(竖屏) --> <integer name="ae_scene_width">1080</integer> <integer name="ae_scene_height">50</integer><!-- res/values-land/dimens.xml(横屏) --> <integer name="ae_scene_width">1920</integer> <integer name="ae_scene_height">50</integer> - 修改AE生成的Java类,通过资源获取尺寸(若无法修改工具生成的代码,此方案不适用):
// 替换原有常量定义 public int getWidth(Context context) { return context.getResources().getInteger(R.integer.ae_scene_width); } public int getHeight(Context context) { return context.getResources().getInteger(R.integer.ae_scene_height); }
内容的提问来源于stack exchange,提问作者Jason John
相关产品推荐
相关产品推荐

