アプリ(レイアウト)XML変数からマニフェストバージョン番号を取得するにはどうすればよいですか?
-
11-10-2019 - |
質問
コードの主要部分にプロジェクトのマニフェストバージョン番号を参照する方法があります。これまで私がやっていたのは、文字列XMLファイルのバージョン番号をマニフェスト(@string/version)にリンクすることです。私がやりたいことは、逆にそれを行うことです。文字列XML変数をマニフェストのバージョンにリンクします。理由? 1つの場所、マニフェストファイルのバージョン番号を変更するだけでいいです。これを行う方法はありますか?ありがとう!
解決 2
バージョンを直接発信する方法はありませんが、実行できる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;
また
int versionCode = getPackageManager().getPackageInfo(getPackageName(), 0).versionCode;
使用できます versionName
アクティビティレイアウトなどのXMLリソースで。最初に文字列リソースを作成します app/build.gradle
次のスニペットがあります android
ノード:
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>
設定クラスを拡張することにより、この問題を解決しました。
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();
. 。パッケージマネージャーからそれを取得することとの違いは何ですか?
申し訳ありませんが、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}"
}
}
次に使用します @string/app_version
XMLで必要に応じて
追加します .debug
デバッグモードの場合、リンクされた記事で説明するバージョン名。
XMLから使用することはできません。
XMLで使用しているウィジェットを拡張し、Konstantin Burovの回答に記載されているものを使用してテキストを設定するロジックを追加する必要があります。
最も簡単なソリューションは使用することです BuildConfig
.
私が使う BuildConfig.VERSION_NAME
私のアプリケーションで。
使用することもできます BuildConfig.VERSION_CODE
バージョンコードを取得します。
ゲームに遅れますが、あなたはそれなしでそれをすることができます @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"
/>