2015-04-08 2 views
12

Я хотел бы иметь файл макета, который ссылается атрибут versionName в моем Gradle файле:Ссылка build.gradle атрибут versionName в макете XML

... 
defaultConfig { 
    applicationId "se.test.myapp" 
    minSdkVersion 14 
    targetSdkVersion 22 
    versionCode 1 
    versionName "1.0" 
} 
.... 

Что-то вроде

<TextView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="@string/versionName" 
    /> 

Есть аккуратный путь к этому, без необходимости настройки макета в моем коде?

ответ

25

По http://tools.android.com/tech-docs/new-build-system вы можете создавать ресурсы непосредственно из Gradle, поэтому поставив

android { 
... 
    defaultConfig { 
     applicationId "se.test.myapp" 
     minSdkVersion 14 
     targetSdkVersion 22 
     versionCode 1 
     versionName "1.0" 
    } 
    ... 
    applicationVariants.all { variant ->  
     variant.resValue "string", "versionName", variant.versionName 
    } 
    ... 
} 

в вашем build.gradle будет делать трюк

Это создает файл ресурсов generated.xml во время компиляции в generated/res папке, которая включена наряду с ресурсами, предоставленными вами в папке значений. Таким образом, вы можете использовать android:text="@string/versionName" для ссылки на это значение. К сожалению, иногда IDE не может разрешить эту ссылку, поэтому она будет выглядеть как ошибка в вашем ресурсе макета (хотя это действительный оператор и будет разрешен во время выполнения).

Вы можете подавить ошибку, щелкнув внутри «@ string/versionName», затем Alt + Enter, в меню выберите «Создать ресурс строкового значения« versionName », затем« Подавить для тега ».

+0

Спасибо! Не могли бы вы более подробно объяснить, как я буду применять это и как это работает? Я предполагаю, что он создает для меня строковую переменную, но как я могу ссылаться на нее в элементе TextView? – Marcus

+6

Создает файл ресурсов 'сгенерированный.xml' во время компиляции в папке' сгенерированный/res', который включен вместе с ресурсами, предоставленными вами в папке 'values'. Таким образом, вы можете использовать 'android: text =" @ string/versionName "' для ссылки на это значение.К сожалению, иногда IDE не может разрешить эту ссылку, поэтому она будет выглядеть как ошибка в вашем ресурсе макета (хотя это действительный оператор и будет разрешен во время выполнения). – OleGG

+0

Я заметил ошибку, но, как вы сказали, она была разрешена во время выполнения. Очень хороший ответ, работающий как шарм! Оценил. – Marcus

0

Я считаю, что вы можете установить VersionName в манифесте android с помощью ресурса строк. Как это:

AndroidManifest.xml

android:versionName="@string/versionName" 

Ваш Layout XML

android:text="@string/versionName" 

Но я не знаю, как это совместимо является Gradle.

+0

Это похоже на то, что не работает: -/ – scorpiodawg

2

Редактировать: Вы не должны использовать Jack только для этого. Согласно the official announcementДжек устарел (для всего, кроме функций Java 8).

Я использовал строковый ресурс:

<resources> 
    <string name="app_ver" translatable="false">1.0.2</string> 
    ... 
</resources> 

в build.gradle о приложении:

android { 
    compileSdkVersion 25 
    buildToolsVersion "25.0.2" 

    defaultConfig { 
     ... 
     versionName "@string/app_ver" 
     jackOptions { 
      enabled true   
     } 
    } 
... 
} 

И как это:

<Preference 
    android:title="Version" 
    android:summary="@string/app_ver"/> 

This проект GitHub содержит рабочую версию этого.

Смежные вопросы