コードの主要部分でプロジェクトのマニフェストバージョン番号を参照する方法が必要です。これまでに行ってきたことは、String XMLファイルのバージョン番号をマニフェスト(@ string/Version)にリンクすることです。私がやりたいのは、逆の方法で、文字列のXML変数をマニフェストのバージョンにリンクすることです。理由?マニフェストファイルという1つの場所でバージョン番号を変更するだけで済みます。これを行う方法はありますか?ありがとう!
バージョンを直接入手する方法はありませんが、2つの回避策があります。
バージョンはリソース文字列に格納され、次の方法でマニフェストに配置できます。
<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
などのニースの簡単な解決策はありません。
私はそれがすでに答えられたと信じています ここ 。
String versionName = getPackageManager().getPackageInfo(getPackageName(), 0).versionName;
OR
int versionCode = getPackageManager().getPackageInfo(getPackageName(), 0).versionCode;
アクティビティレイアウトなどのXMLリソースでversionName
を使用できます。まず、Android
ノードに次のスニペットを使用して、app/build.gradle
に文字列リソースを作成します。
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'
}
その後、XMLで@string/versionName
を使用できます。 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>
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>
BuildConfig.VERSION_NAME.toString();
を使用します。それとpackageManagerから取得することの違いは何ですか?
残念ながら、XMLベースのソリューションは機能していません。
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}"
}
}
xMLで必要に応じて@string/app_version
を使用するようになりました
デバッグモードの場合、リンクされた記事で説明されているように、バージョン名に.debug
を追加します。
XMLから使用することはできません。
XMLで使用しているウィジェットを拡張し、Konstantin Burovの回答に記載されている内容を使用してテキストを設定するロジックを追加する必要があります。
最も簡単な解決策は、BuildConfig
を使用することです。
アプリケーションでBuildConfig.VERSION_NAME
を使用しています。
BuildConfig.VERSION_CODE
を使用してバージョンコードを取得することもできます。