正确的屏幕密度相关产品风格源代码的方法

时间:2014-12-12 17:33:56

标签: java android gradle android-studio

在Android中,有时应用程序的平板电脑与手机版本的差异达到了我需要创建完全独立的活动以及每个版本的其他组件的程度。例如,我的平板电脑应用程序的主视图中可能包含与电话应用程序中的模块完全不同的模块。这些差异超出了布局文件中的配置限定符。

使用gradle for Android,我看到有两种方法可以支持每种产品风格的不同源代码。特别是在手机和平​​板电脑产品风格的示例中,选项1似乎使用包名称:

 phone {
            packageName
            "com.ebookfrenzy.buildexample.app.phone"
            versionName "1.0-phone"
        }

选项二是使用源集来定义附加代码​​或全新的源目录:

sourceSets {
    phone {
        java {
            srcDir 'src/phone/java'
        }

    }
}

哪个选项是正确的方法?我没有在Google的文档中找到任何内容,我担心如果我选择了错误的方法,我可能会错过未来对Android Studio版本中“正确”方法的支持。

2 个答案:

答案 0 :(得分:3)

  

哪个选项是正确的方法?

恕我直言,

选项#1不会为每个版本创建完全独立的活动以及其他组件"。它会将您的代码打包成一个单独的APK。另请注意,前一段时间产品风格配置中packageName已替换为applicationId

选项#2可能有效,但是没有必要,而且比混淆IDE的更容易。


首先,你需要问问自己,"自我,我真的需要两个独立的APK,以及引起的所有头痛,而不是只有一个带有智能分支的APK来选择合适的东西吗?"

例如,假设您决定要让PhoneActivityTabletActivity填充相同的角色,但应分别在较小屏幕和较大屏幕设备上使用。在这种情况下,将两者放在同一个应用程序中,并使用与资源集绑定的布尔资源(例如,res/values/bools.xmlres/values-sw720dp/bools.xml)来确定将根据屏幕大小启用哪一个。对于由第三方发起的活动(例如,MAIN / LAUNCHER活动),可能只需要所有活动。对于您自己开始的活动,您需要几行Java代码来配置与Intent一起使用的正确startActivity()

坚持使用一个APK文件将简化发布,包括在不支持单个产品拥有多个APK的概念的频道上实际使用。


如果您确定确实需要两个APK,那么产品口味就是正确答案。但是,您可以将特定于尺寸的代码放在flavor-specific sourcesets中,这些代码可供您使用"开箱即用"没有配置,而不是黑客入侵你自己的源目录。

因此,除了src/main/之外,您可能还有src/pocketSized/src/goshDarnedHuge/作为源集,与pocketSizedgoshDarnedHuge产品风格相关联。风味独有的代码在风味源集中(例如,每个中的MainActivity实现),并且共同的代码保留在src/main/中。您的分销渠道(例如,Play商店)可能有额外的规则,用于在同一个市场列表下分发多个APK(例如,<compatible-screens>或某些东西,告诉市场在哪种情况下使用哪个APK)。

答案 1 :(得分:1)

你可以这样做创建一个值为“values-sw600dp”的新文件夹 它创建一个文件bool资源并创建你的文件夹“values”bool另一个资源文件,你必须在每个这样的文件中创建一个布尔值。

"values-sw600dp"
<resources>
     <bool
         name = "isTablet"> true </bool>
</ resources>

"values"
<resources>
     <bool
         name = "isTablet">false</bool>
</ resources>


//in your code you must put

if (getResources.getBoolean(R.bool.isTablet)) {
      // Your code for tablet
} else {
      // Your code for smartphone
}