[英]Correct way to source code for screen density related product flavors
在Android中,有時候應用程序的平板電腦版本與手機版本有所不同,我需要為每個版本創建完全獨立的活動以及其他組件。 例如,我的平板電腦應用程序的主視圖中可能包含與電話應用程序中的模塊完全不同的模塊。 這些差異超出了布局文件中的配置限定符。
對於Android的gradle,我見過兩種支持每種產品風格不同源代碼的方法。 特別是在具有電話和平板電腦產品口味的示例中,選項1似乎使用了程序包名稱:
phone {
packageName
"com.ebookfrenzy.buildexample.app.phone"
versionName "1.0-phone"
}
方法二是改為使用源集來定義其他代碼或整個新的源目錄:
sourceSets {
phone {
java {
srcDir 'src/phone/java'
}
}
}
哪個選項是正確的方法? 我沒有在Google文檔中找到任何內容,我擔心的是,如果我選擇了錯誤的方法,則可能會錯過將來在Android Studio發行版中對“正確”方法的支持。
哪個選項是正確的方法?
恕我直言,兩者都不是。
選項#1不會“為每個版本創建完全獨立的活動以及其他組件”。 確實會將您的代碼打包到一個單獨的APK中。 另請注意,前段時間在產品風味配置中將packageName
替換為applicationId
。
選項#2可能有效,但不是必需的,並且比使IDE混亂的替代方法更容易實現。
首先,您需要問自己:“我自己,我真的需要兩個單獨的APK,以及所有引起的頭痛,而不是擁有一個帶有智能分支的APK來選擇正確的東西嗎?”。
例如,假設您決定要讓PhoneActivity
和TabletActivity
擔當相同的角色,但應分別在小屏幕和大屏幕設備上使用。 在那種情況下,將兩者都放在同一個應用程序中,並使用綁定到資源集的布爾資源(例如res/values/bools.xml
和res/values-sw720dp/bools.xml
)來確定將啟用哪個資源在屏幕尺寸上。 對於要由第三方啟動的活動(例如MAIN
/ LAUNCHER
活動),可能僅需要這些。 對於您自己開始的活動,您需要幾行Java代碼來配置要與startActivity()
一起使用的Intent
。
堅持使用一個APK文件可以簡化分發,包括使實際上可以在不支持單個產品具有多個APK的渠道上進行。
如果您確定確實需要兩個APK,那么產品口味就是正確的答案。 但是,您可以將特定於大小的代碼放入特定於風味的資源集中,而無需配置即可“開箱即用”使用它們,而不必在自己的源目錄中進行入侵。
因此,除了src/main/
,您還可以將src/pocketSized/
和src/goshDarnedHuge/
作為源集,與pocketSized
和goshDarnedHuge
產品風格綁定在一起。 風味唯一的代碼位於風味的源集中(例如,每個源中都有一個MainActivity
實現),而常見的代碼則保留在src/main/
。 您的發行渠道(例如Play商店)可能還有其他規則,用於在同一市場列表(例如<compatible-screens>
或告訴市場在哪種情況下使用哪個APK的東西)下分發多個APK。
您可以執行以下操作:創建一個新的value文件夾,即“ 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
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.