189

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

4

9 に答える 9

369

ここですでに回答されていると思います。

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

また

int versionCode = getPackageManager().getPackageInfo(getPackageName(), 0).versionCode;
于 2010-12-17T14:00:15.997 に答える
104

バージョンを直接取得する方法はありませんが、実行できる回避策が 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

于 2012-12-09T17:59:28.573 に答える
79

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>
于 2016-04-07T06:48:03.887 に答える
16

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_versionXML で必要に応じて使用できるようになりました

.debugデバッグ モードの場合、リンクされた記事で説明されているように、バージョン名に追加されます。

于 2018-08-19T02:34:59.833 に答える
15

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>
于 2013-11-23T01:55:32.977 に答える
3

XML からは使用できません。

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

于 2010-12-17T20:48:21.343 に答える
-1

@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"
     />
于 2013-09-09T15:37:05.007 に答える