web-dev-qa-db-ja.com

アプリの(レイアウト)XML変数からマニフェストバージョン番号を取得するにはどうすればよいですか?

コードの主要部分でプロジェクトのマニフェストバージョン番号を参照する方法が必要です。これまでに行ってきたことは、String XMLファイルのバージョン番号をマニフェスト(@ string/Version)にリンクすることです。私がやりたいのは、逆の方法で、文字列のXML変数をマニフェストのバージョンにリンクすることです。理由?マニフェストファイルという1つの場所でバージョン番号を変更するだけで済みます。これを行う方法はありますか?ありがとう!

176
PearsonArtPhoto

バージョンを直接入手する方法はありませんが、2つの回避策があります。

  1. バージョンはリソース文字列に格納され、次の方法でマニフェストに配置できます。

    <manifest xmlns:Android="http://schemas.Android.com/apk/res/Android"
         package="com.somepackage"
         Android:versionName="@string/version" Android:versionCode="20">
    
  2. カスタムビューを作成し、XMLに配置できます。ビューはこれを使用して名前を割り当てます。

    context.getPackageManager().getPackageInfo(context.getPackageName(), 0).versionName;
    

これらのソリューションのどちらでも、XMLでバージョン名を配置できます。残念ながら、Android.R.string.versionなどのニースの簡単な解決策はありません。

98
PearsonArtPhoto

私はそれがすでに答えられたと信じています ここ

String versionName = getPackageManager().getPackageInfo(getPackageName(), 0).versionName;

OR

int versionCode = getPackageManager().getPackageInfo(getPackageName(), 0).versionCode;
360

アクティビティレイアウトなどの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 St​​udioは赤でマークしますが、アプリは問題なくコンパイルされます。たとえば、これは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>
59
Arun Shankar

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>
15
seastland

BuildConfig.VERSION_NAME.toString();を使用します。それとpackageManagerから取得することの違いは何ですか?

残念ながら、XMLベースのソリューションは機能していません。

10
Mullazman

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を追加します。

6
CrandellWS

XMLから使用することはできません。

XMLで使用しているウィジェットを拡張し、Konstantin Burovの回答に記載されている内容を使用してテキストを設定するロジックを追加する必要があります。

2
Macarse

最も簡単な解決策は、BuildConfigを使用することです。

アプリケーションでBuildConfig.VERSION_NAMEを使用しています。

BuildConfig.VERSION_CODEを使用してバージョンコードを取得することもできます。

0
cHAuHaN