2016-05-26 62 views
16

resValue方法(或任何它被稱爲)允許您在buildTypesproductFlavors設置資源值有沒有相應的方法得到資源值是由resValue設置的?如何在build.gradle中獲取資源值?

似乎productFlavorsbuildTypes之前評估,所以resValuebuildTypes優先。我想在調試版本中將「Debug」附加到應用程序名稱中,但我需要獲取在產品風格中設置的值以附加到它。

編輯:我試過馬爾辛 - 科津斯基的建議,使用一個變量,但任何構建類型之前所有產品口味進行評估。因此,這並不工作:

android { 
    String appName = "" 

    productFlavors { 
     Foo { 
      appName = "Foo" 
     } 

     Bar { 
      appName = "Bar" 
     } 
    } 

    buildTypes { 
     release { 
      resValue "string", "app_name", appName 
     } 

     debug { 
      resValue "string", "app_name", appName + " Debug" 
     } 
    } 
} 

buildTypesappName總是從最後產品風味的價值。所以在這個例子中,所有版本都會收到名稱"Bar""Bar Debug"

基本上,我需要一個resValueSuffix類似於applicationIdSuffix。顯然沒有這樣的動物存在。 com.android.application插件是否暴露了我可以用來實現這一目的的任何內容?

+0

http://stackoverflow.com/questions/17275461/how-to-replace-strings-resources-with-android-gradle –

+0

@TimCastelijns Q&A是關於來自'strings.xml'的資源。我的資源是用'resValue'創建的。 –

+0

app_name是否在您的應用程序中除了清單之外的任何地方使用? – cyroxis

回答

21

如果喲你只是試圖設置應用標籤(或其他清單值),你可以用明顯的佔位符解決這個問題。

android { 

    productFlavors { 
     Foo { 
      applicationId "com.myexample.foo" 
      manifestPlaceholders = [ appName:"Foo"] 
     } 

     Bar { 
      applicationId "com.myexample.bar" 
      manifestPlaceholders = [ appName:"Bar"] 
     } 
    } 

    buildTypes { 
     release { 
      manifestPlaceholders = [ appNameSuffix:""] 
     } 

     debug { 
      manifestPlaceholders = [ appNameSuffix:".Debug"] 
      applicationIdSuffix ".debug" 
     } 
    } 
} 

然後在你的Android清單您只需使用這兩個佔位符爲你的應用程序名稱(或其他值)

<application 
     android:label="${appName}${appNameSuffix}" 
     ... 
</application> 

這允許您在單個設備上安裝並排所有4個變量的一面,以及因爲在應用程序抽屜/啓動器中給他們不同的名字。

+0

非常好!謝謝。 –

+7

我仍然很好奇OP的問題如何在獲取資源價值的問題上得到回答... –

+0

我不知道它是否可能,如果是我一直無法弄清楚。 – cyroxis

1

要在調試版本中擁有替代版本的資源,您可以使用調試源集。

strings.xml可以在以下路徑src/main/res/values中找到,這意味着它位於主源集中。如果您創建了一個新目錄src/debug/res/values,則可以將新的strings.xml文件與應該在調試版本中重寫的值一起放入。例如:

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
    <string name="app_name">My Application Debug</string> 
</resources> 

這將取代您的主文件中的任何值app_name。你不必在這裏複製所有的字符串 - 這裏沒有包含的字符串只是從主文件中獲取。

+1

資源不在'strings.xml'中。我使用'resValue'創建它,因爲我預計要增加構建變體*產品風格的數量,並且我希望避免爲每個組合創建'strings.xml'。 –

+0

如果您使用'resValue'創建原始值,那麼您不必從資源中讀取它。您已在'build.gradle'腳本中擁有該值。只需將它分配給一個局部變量並用它爲每個變體創建一個資源。 –

+0

我試着把變量放在'android'範圍內。所有產品口味都在任何構建類型之前運行,因此每個構建類型都會看到最後一個產品口味中分配的值。 –

3

您可以檢查構建變種這樣

在gradle這個定義值

buildTypes { 
    debug{ 
     buildConfigField "String", "Your_string_key", '"yourkeyvalue"' 
     buildConfigField "String", "SOCKET_URL", '"some text"' 
     buildConfigField "Boolean", "LOG", 'true' 
    } 
    release { 
     buildConfigField "String", "Your_string_key", '"release text"' 
     buildConfigField "String", "SOCKET_URL", '"release text"' 
     buildConfigField "Boolean", "LOG", 'false' 

    } 
} 

並訪問使用建變種這些值:

if(!BuildConfig.LOG) 
     // do something with the boolean value 

或者

view.setText(BuildConfig.yourkeyvalue); 
+0

有問題的資源是應用程序名稱,所以它必須是一個資源。 –