Я хотел бы иметь способ ссылаться на номер версии манифеста проекта в основной части кода. До сих пор я делал ссылку на номер версии в XML файле String на манифест (@string/Version). То, что я хотел бы сделать, это сделать это наоборот, связать переменную XML строки с версией в манифесте. Причина? Я хотел бы только изменить номер версии в одном месте, файле манифеста. Есть какой-либо способ сделать это? Спасибо!
Как вы можете получить номер версии манифеста из XML-переменных приложения (макета)?
Ответ 1
Невозможно напрямую получить версию, но есть два способа работы, которые можно выполнить.
-
Версия может быть сохранена в строке ресурса и помещена в манифест:
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.somepackage" android:versionName="@string/version" android:versionCode="20">
-
Можно создать настраиваемое представление и поместить его в XML. Представление будет использовать это для назначения имени:
context.getPackageManager().getPackageInfo(context.getPackageName(), 0).versionName;
Любое из этих решений позволило бы разместить имя версии в XML. К сожалению, нет простого простого решения, например android.R.string.version
или что-то в этом роде.
Ответ 2
Я считаю, что уже был дан ответ здесь.
String versionName = getPackageManager().getPackageInfo(getPackageName(), 0).versionName;
ИЛИ
int versionCode = getPackageManager().getPackageInfo(getPackageName(), 0).versionCode;
Ответ 3
Вы можете использовать versionName
в XML-ресурсах, таких как макеты действий. Сначала создайте строковый ресурс в app/build.gradle
со следующим фрагментом в android
node:
applicationVariants.all { variant ->
variant.resValue "string", "versionName", variant.versionName
}
Таким образом, содержимое файла build.gradle
может выглядеть следующим образом:
apply plugin: 'com.android.application'
android {
compileSdkVersion 23
buildToolsVersion '24.0.0 rc3'
defaultConfig {
applicationId 'com.example.myapplication'
minSdkVersion 15
targetSdkVersion 23
versionCode 17
versionName '0.2.3'
jackOptions {
enabled true
}
}
applicationVariants.all { variant ->
variant.resValue "string", "versionName", variant.versionName
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
productFlavors {
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:23.3.0'
compile 'com.android.support:design:23.3.0'
compile 'com.android.support:support-v4:23.3.0'
}
Затем вы можете использовать @string/versionName
в XML. Android Studio отметит его красным, но приложение будет компилироваться без проблем. Например, это можно использовать как в app/src/main/res/xml/preferences.xml
:
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<PreferenceCategory
android:title="About"
android:key="pref_key_about">
<Preference
android:key="pref_about_build"
android:title="Build version"
android:summary="@string/versionName" />
</PreferenceCategory>
</PreferenceScreen>
Ответ 4
Я решил эту проблему, расширив класс Preference.
package com.example.android;
import android.content.Context;
import android.preference.Preference;
import android.util.AttributeSet;
public class VersionPreference extends Preference {
public VersionPreference(Context context, AttributeSet attrs) {
super(context, attrs);
String versionName;
final PackageManager packageManager = context.getPackageManager();
if (packageManager != null) {
try {
PackageInfo packageInfo = packageManager.getPackageInfo(context.getPackageName(), 0);
versionName = packageInfo.versionName;
} catch (PackageManager.NameNotFoundException e) {
versionName = null;
}
setSummary(versionName);
}
}
}
Затем в моих предпочтениях XML:
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<com.example.android.VersionPreference android:title="Version" />
</PreferenceScreen>
Ответ 5
Я использую BuildConfig.VERSION_NAME.toString();
. Какая разница между этим и получением его от packageManager?
Никакие решения на основе XML не работали для меня, извините.
Ответ 6
Если вы используете Gradle, вы можете использовать файл build.gradle, чтобы программно добавить значение к ресурсам xml во время компиляции.
Пример кода извлечен из: https://medium.com/@manas/manage-your-android-app-s-versioncode-versionname-with-gradle-7f9c5dcf09bf
buildTypes {
debug {
versionNameSuffix ".debug"
resValue "string", "app_version", "${defaultConfig.versionName}${versionNameSuffix}"
}
release {
resValue "string", "app_version", "${defaultConfig.versionName}"
}
}
теперь используйте @string/app_version
мере необходимости в XML
Он добавит .debug
к названию версии, как описано в связанной статье, в режиме отладки.
Ответ 7
Вы не можете использовать его из XML.
Вам нужно расширить виджет, который вы используете в XML, и добавить логику, чтобы установить текст, используя то, что было упомянуто в письме Константина Бурова.
Ответ 8
BuildConfig
решение - использовать BuildConfig
.
Я использую BuildConfig.VERSION_NAME
в своем приложении.
Вы также можете использовать BuildConfig.VERSION_CODE
для получения кода версии.
Ответ 9
Поздно к игре, но вы можете сделать это без @string/xyz
, используя ?android:attr
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="?android:attr/versionName"
/>
<!-- or -->
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="?android:attr/versionCode"
/>